企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 微信支付 ### 说明 在开发网页、微信公众号H5页面的过程中,微信支付是常用的使用场景。使用wxpay微信支付插件,可以快速的对项目集成微信支付功能。 当然可以在不使用插件的情况下,自己开发微信支付功能。微信支付基于EasyWechat,参考开发地址:https://www.easywechat.com/docs/master/zh-CN/payment/index >[info] 微信支付插件地址:http://www.eacoophp.com/appstore_plugin/wxpay ### 插件使用要求 ~~~ 1. 依赖于composer安装easywechat,命令行composer require overtrue/wechat:~4.0 -vvv 2. EacooPHP系统版本1.1.0+ 3. 微信商户号配置信息 ~~~ ### 应用场景 1.微信公众号H5支付 2.微信扫码支付,常用于PC端 3.APP接口调起微信支付 ### 实现过程 **1.后台配置支付信息** ![微信支付后台配置](https://box.kancloud.cn/7797d8110857b7f28db63ac74afdc7f3_2740x1578.jpg) **2.在微信商户平台配置支付授权目录** ![](https://box.kancloud.cn/fef61c432b30684ddb2908680e505dff_2752x1520.jpg) **3.在控制器中需要处理微信支付的地方添加代码,例如** ~~~ $total_fee=0.01; $out_trade_no=订单号; $body='测试支付'; $notify_url = 支付异步通知地址; $openid = 微信OPENID; $params = [ 'money' => $total_fee, 'order_number' => $out_trade_no, 'body' => $body, 'notify_url' => $notify_url, 'openid' => $openid, 'trade_type' => 'JSAPI' ]; $result = hook('wxpay',$params,true); return $result; ~~~ 返回结果根据trade_type的参数而定,目前支持JSAPI,NATIVE,APP... 比如:trade_type参数为JSAPI,默认返回json字符串。用于WeixinJSBridge发起的支付方式。 **4.要确认主题或模版中启用了页面尾部钩子PageFooter。** ~~~ html代码: {:hook('PageFooter')} ~~~ 因为微信支付插件封装的js代码会在这个钩子中加载。 **5.在自己开发的js代码中调用封装的支付方法。** ~~~[js] $.post(请求URL, data, function(result) { jsWxpay(result); }) ~~~ **6.完成上面的工作就能调起微信支付框了。** 微信支付成功后,支付结果会异步发送到通知地址,就是第3步中设置的notify_url。通知接收方法接收到结果数据后就进行处理。 **7.异步通知处理** 直接上代码例子: ~~~ public function Notify() { $wxpay_class = get_plugin_class('wxpay'); if (!class_exists($wxpay_class)) { //wxpay插件类不存在 echo 'fail'; exit; } $wxpay = new $wxpay_class; $wxpay_app = $wxpay->initPayment(); $response = $wxpay_app->handlePaidNotify(function($message, $fail){ // 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单 $order = 查询订单($message['out_trade_no']); if (!$order) { // 如果订单不存在 $fail('Order not exist.'); // 告诉微信,我已经处理完了,订单没找到,别再通知我了 } // 如果订单存在 // 检查订单是否已经更新过支付状态 if ($order->paid_at) { // 假设订单字段“支付时间”不为空代表已经支付 return true; // 已经支付成功了就不再更新了 } // 用户是否支付成功 if ($message['result_code'] === 'SUCCESS') { // 不是已经支付状态则修改为已经支付状态 $order->paid_at = time(); // 更新支付时间为当前时间 $order->status = 'paid'; } else { // 用户支付失败 $order->status = 'paid_fail'; } $order->save(); // 保存订单 return true; // 返回处理完成 }); return $response->send(); // return $response; } ~~~ ## 最后 插件中包含Demo,不过要自己改写,主要提供思路