当前位置: 代码迷 >> 综合 >> thinkphp5+easywechat:微信公众号内支付
  详细解决方案

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

热度:77   发布时间:2023-11-16 22:23:14.0

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

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

    2,页面样子如下:

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



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

这里为了掩饰,直接使用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. <html>
  2. <head>
  3. <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
  4. <meta name="viewport" content="width=device-width, initial-scale=1"/>
  5. <title>发起支付-支付</title>
  6. <script type="text/javascript">
  7. //调用微信JS api 支付
  8. function jsApiCall()
  9. {
  10. WeixinJSBridge.invoke(
  11. 'getBrandWCPayRequest',{ $jsondata},
  12. function(res){
  13. WeixinJSBridge.log(res.err_msg);
  14. alert(res.err_code+res.err_desc+res.err_msg);
  15. }
  16. );
  17. }
  18.  
  19. function callpay()
  20. {
  21. if (typeof WeixinJSBridge == "undefined"){
  22. if( document.addEventListener ){
  23. document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
  24. }else if (document.attachEvent){
  25. document.attachEvent('WeixinJSBridgeReady', jsApiCall);
  26. document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
  27. }
  28. }else{
  29. jsApiCall();
  30. }
  31. }
  32. callpay();
  33. </script>
  34. </head>
  35. <body>
  36. <div align="center">
  37. 正在发起支付,请稍后...
  38. </div>
  39. </body>
  40. </html>
html代码就看你自己发挥了,总之把微信返回的jsondata返回到前端,然后callpay()调起支付就好了,效果如下:


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