1、用户在商户侧完成下单,使用微信支付进行支付
2、由商户后台向微信支付发起下单请求(调用统一下单接口)注:交易类型trade_type=MWEB
3、统一下单接口返回支付相关参数给商户后台,如支付跳转url(参数名“mweb_url”),商户通过mweb_url调起微信支付中间页
4、中间页进行H5权限的校验,安全性检查(此处常见错误请见下文)
5、如支付成功,商户后台会接收到微信侧的异步通知
6、用户在微信支付收银台完成支付或取消支付,返回商户页面(默认为返回支付发起页面)
7、商户在展示页面,引导用户主动发起支付结果的查询
8,9、商户后台判断是否接收到微信侧的支付结果通知,如没有,后台调用我们的订单查询接口确认订单状态(查单实现可参考:支付回调和查单实现指引)
10、展示最终的订单支付结果给用户
官方手册 :
https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4
<?php // 微信开发配置 return array( /* -------- 微信支付 [ H5 支付 ] 需要的配置 -------- */ 'MWEB' => array( // 与微信支付绑定的公众号 app id 'appid' => 'wx***', // 微信支付商户ID 'mchid' => '15***', // 微信支付对应的KEY 'key' => '******' )
<?php class wxPayController extends grace{ public function index(){ /* * 微信支付后端示例代码 * 模拟一个1元的支付信息,真实环境可以利用订单数据来产生下面的order数据 */ //模拟一个简单的订单信息 $order = array( 'id' => mt_rand(111111111,999999999), // 订单号码 'price' => 2 // 订单价格 ); //使用统一下单接口返回微信支付前端必须的信息 $orderWxPay = array(); $orderWxPay['body'] = '支付描述'; //支付描述 //商户系统内部订单号,要求32个字符内 $orderWxPay['out_trade_no'] = 'MWEB-'.$order['id']; //总价,需要 * 100 $orderWxPay['total_fee'] = $order['price']; //异步接收微信支付结果通知的回调地址 $orderWxPay['notify_url'] = 'https://域名/wxPay/payback/'; //实例化微信支付对象 $graceWeChat = new \phpGrace\tools\graceWeChat(); $graceWeChatPay = new \phpGrace\tools\graceWeChat\pay($graceWeChat); //生成订单 $res = $graceWeChatPay->createOrder($orderWxPay, 'MWEB'); //p($res); // 失败 Array ( [return_code] => FAIL [return_msg] => appid不存在 ) // 成功 Array ( [return_code] => SUCCESS [return_msg] => OK ... [mweb_url] => weixin://wxpay/bizpayurl?pr=zgYRjTjzz ) if(!empty($res['mweb_url'])){ header('location:'.$res['mweb_url']); exit(); } // 参考手册 // https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4 } // 支付成功后微信支付服务器异步通知接口 // 根据通知结果处理订单状态等后续工作 public function payback(){ $graceWeChat = new \phpGrace\tools\graceWeChat(); $graceWeChatPay = new \phpGrace\tools\graceWeChat\pay($graceWeChat); $res = $graceWeChatPay->payBack('MWEB'); // 将 res 数组与数据库内订单信息进行比对,比对后进行后续操作,如:更新订单、发送通知...... file_put_contents('pay.txt', json_encode($res, JSON_UNESCAPED_UNICODE)); echo '<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> </xml>'; } }