thinkphp5+easywechat:微信公众号内支付

 前几天写了一下使用tp5和easywechat集成微信扫码支付的方法(可以点这里查看),里面已经说过咱们安装easywechat了,这里就不在重复说明了,直接写集成的步骤了:

    1,相关的配置请参考之前的第一篇文字

    2,页面样子如下:

thinkphp5+easywechat:微信公众号内支付_第1张图片

页面代码就不贴了,就只是写了下按钮的代码如下:


  1. href="{:url('mobile/recharge/pay',['amount'=>1])}" type="button" style="width: 98%;height: 40px;background: #2ba245;border: 0;color: #fff;font-size: 16px;">使用微信支付

这里为了掩饰,直接使用a链接跳转,amount就是需要支付的金额,这里的逻辑可以根据自己的情况处理,直接的传递金额还是不要的好,跳转到pay之后,向微信请求生成预支付订单,并获取调取微信支付的相关内容:

Recharge.php中function pay的代码如下:

  1. namespace app\payment\controller;
  2. use EasyWeChat\Foundation\Application;
  3. use EasyWeChat\Payment\Order;
  4. class Wxpay extends Prepay
  5. {
  6. public function pay(){
  7. $money = I('money',0);
  8. //创建支付订单
  9. $params = $this->create_order($money);
  10. if($params !== false) {
  11. $options = [
  12. // 前面的appid什么的也得保留哦
  13. 'app_id' => 'xxxx',
  14. // ...
  15. // payment
  16. 'payment' => [
  17. 'merchant_id' => 'your-mch-id',
  18. 'key' => 'key-for-signature',
  19. 'cert_path' => getcwd() . "\\Cert\\wechat\\apiclient_cert.pem", // XXX: 绝对路径!!!!
  20. 'key_path' => getcwd() . "\\Cert\\wechat\\apiclient_key.pem", // XXX: 绝对路径!!!!
  21. 'notify_url' => 'http://www.xxx.com/wxnotify/notify.html', // 你也可以在下单时单独设置来想覆盖它
  22. ],
  23. ];
  24.  
  25. $wxApp = new Application($options);
  26. $payment = $wxApp->payment;
  27. $attributes = [
  28. 'trade_type' => 'JSAPI', // JSAPI,NATIVE,APP...
  29. 'body' => '元宝充值-' . $money . "-" . $params['uid'],
  30. 'detail' => $params['out_trade_no'],
  31. 'out_trade_no' => $params['out_trade_no'],
  32. 'total_fee' => $money * 100, // 单位:分
  33. // 'notify_url' => 'http://xxx.com/order-notify', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
  34. 'openid' => $this->uinfo['openid'], // trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识,
  35. // ...
  36. ];
  37.  
  38. $order = new Order($attributes);
  39. $result = $payment->prepare($order);
  40. if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS') {
  41. $prepayId = $result->prepay_id;
  42. $json = $payment->configForPayment($prepayId);
  43. $this->assign('jsondata',$json);
  44. return $this->fetch('yb-prepay');
  45. }else{
  46. return $this->error('调起支付失败,稍后再试');
  47. }
  48. }else{
  49. return $this->error('充值订单创建失败,稍后再试');
  50. }
  51. }
  52. }
对应的前台html代码:

 
  
  1. http-equiv="content-type" content="text/html;charset=utf-8"/>
  2. name="viewport" content="width=device-width, initial-scale=1"/>
  3. </span><span class="pln" style="color:rgb(102,217,239);">发起支付-支付</span><span class="tag" style="color:rgb(249,38,89);">
  4. type="text/javascript">
  5. //调用微信JS api 支付
  6. function jsApiCall()
  7. {
  8. WeixinJSBridge.invoke(
  9. 'getBrandWCPayRequest',{$jsondata},
  10. function(res){
  11. WeixinJSBridge.log(res.err_msg);
  12. alert(res.err_code+res.err_desc+res.err_msg);
  13. }
  14. );
  15. }
  16.  
  17. function callpay()
  18. {
  19. if (typeof WeixinJSBridge == "undefined"){
  20. if( document.addEventListener ){
  21. document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
  22. }else if (document.attachEvent){
  23. document.attachEvent('WeixinJSBridgeReady', jsApiCall);
  24. document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
  25. }
  26. }else{
  27. jsApiCall();
  28. }
  29. }
  30. callpay();
  31. align="center">
  32. 正在发起支付,请稍后...
  • html代码就看你自己发挥了,总之把微信返回的jsondata返回到前端,然后callpay()调起支付就好了,效果如下:

    thinkphp5+easywechat:微信公众号内支付_第2张图片

    至于回调,参考之前的第一篇即可,处理方式是一样的(一、thinkphp5使用easywechat集成微信扫码支付),其实用easywechat很简单,构建支付参数之后执行即可,公众号内支付一定要支付参数要包含openid,获取openid的方法很多这里暂时就不讨论了,更多使用可以去看easywechat的手册,希望对于你帮助。

    你可能感兴趣的:(微信)