🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
**目录 (Table of Contents)** [TOC] ## 微信公众号内JS API 支付 我们模拟会员充值业务 ### 步骤1、 后端统一下单 Order.php页面 ```PHP //配置微信支付必要的参数 $wxConfigure = new WechatConfig(); $wxConfigure->setParameter("appid",YOUR_APPID); $wxConfigure->setParameter("appsecret",YOUR_SECRET); $wxConfigure->setParameter("mchid",YOUR_MCHID']); $wxConfigure->setParameter("key",YOUR_KEY); // 您的微信支付回调的地址,一般callback存放域名部分,这里我们假设域名是https://wx.endor-test.com/ $wxConfigure->setParameter("callback",YOUR_CALLBACK); $jsPay = new JsPay($wechatConfig); $orderSn = null; $totalPrice = null; $openid = null; // 第一次发起支付请求,需要通过code去获取openid if(isset($_GET['code'] )) { $totalPrice = $_POST['totalPrice'] * 100; // 微信支付以分为单位 $out_trade_no = date("YmdHisms") ; // 这一部分是本地服务器操作订单的部分,根据实际情况自行处理 $orderInfo = [ 'out_trade_no' => $out_trade_no, 'user_id' => $_POST['user_id'],// user_id是本地系统中用户的id,根据实际情况获取,这里只是举例说明 'total_price'=>$totalPrice, 'order_status'=>'未支付', 'pay_time'=>'', ]; // 将orderInfo 保存到本地服务器数据库,假设这里已经保存 // 生成获取code的链接,假设当前下单的路由是 https://wx.endor-test.com/order.php $callbackUrl = $wxConfigure->setParameter("callback"); // 生成的url需要将本地服务器订单号带上 $callbackUrl = $callbackUrl . "/order.php?out_trade_no=".$out_trade_no; $url = $jsPay->createOauthUrlForCode($callbackUrl); // 如果是SPA应用,这里将url返回给前端,前端通过location.href跳转,跳转后获取 // 路由中的code,将下单接口的参数加上out_trade_no和code,再次调用相同的下单接口 // 发起请求 header("location:".$url); } else { // 跳转后,url中是有code的参数的,将执行eles部分 $out_trade_no = $_GET['out_trade_no']; $code = $_GET['code'] ; // 通过 $out_trade_no 去本地服务器数据库获取订单信息 // 假设我们已经拿到订单信息 $orderInfo $jsPay->setCode($code); $openId = $jsPay->getOpenId(); if($openid == null) { // 出错逻辑自行处理... return ; } // 在这里完成微信公众号统一订单下单 $unifiedOrder = new UnifiedOrder($wxConfigure); // 设置微信支付必填参数 $unifiedOrder->setParamter("openid",$openid); $unifiedOrder->setParamter("body","会员VIP充值业务"); // 商品描述 $unifiedOrder->setParamter("total_fee",$orderInfo['total_price']); $unifiedOrder->setParamter("out_trade_no",$out_trade_no ); $unifiedOrder->setParamter("out_trade_no",$out_trade_no ); $unifiedOrder->setParamter("out_trade_no",$out_trade_no ); $callbackUrl = $wxConfigure->setParameter("callback"); $unifiedOrder->setParamter("notify_url",$callbackUrl."/paycallback.php");//异步通知回调地址,假设我们这里是paycallback.php页面 $unifiedOrder->setParamter("trade_type","JSAPI"); $prepay_id = $UnifiedOrder->getPrepayId(); // 获取微信支付预订单ID // 使用jsapi 唤起支付 $jsPayParameters = $jsPay->getParameters(); // 获取js支付对象的配置参数,前端使用 echo $jsPayParameters; // 将$jsPayParamters 返回给前端页面 } } ``` ### 步骤2 、前端:发起支付请求 Order.html >[info]这个html页面也是微信官方给出的,关键点就是用Order.php中生成的$jsPayParameters 初始化 WeixinJSBridge.invoke()的第二个参数。 ```Javascript <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"/> <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"></script> <title>微信安全支付</title> <script type="text/javascript"> //调用微信JS api 支付 function jsApiCall() { WeixinJSBridge.invoke( 'getBrandWCPayRequest', <?php echo $jsApiParameters; ?>, function(res){ if(res.err_code+res.err_desc+res.err_msg=="NaNget_brand_wcpay_request:ok"){ location=跳转到您处理成功的显示页面 } else { location=跳转到您处理失败的显示页面; } }); } function callpay() { if (typeof WeixinJSBridge == "undefined"){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', jsApiCall, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', jsApiCall); document.attachEvent('onWeixinJSBridgeReady', jsApiCall); } }else{ jsApiCall(); } } window.onload = function(){ callpay(); } </script> </head> <body> </br></br></br></br> </body> </html> ``` ### 步骤3 、后端:微信支付回调事件 paycallback.php ```PHP //配置微信支付必要的参数 $wxConfigure = new WechatConfig(); $wxConfigure->setParameter("appid",YOUR_APPID); $wxConfigure->setParameter("appsecret",YOUR_SECRET); $wxConfigure->setParameter("mchid",YOUR_MCHID']); $wxConfigure->setParameter("key",YOUR_KEY); // 定义回调事件对象 $notify = new Notify($wxConfigure); // 等待微信回调后,回执行您定义的闭包函数 $nofify->waitPaymentNotifyResults(function ($results,$status) use ($notify) { if($status === "SUCCESS") { // 如果$status === "SUCCESS",说明本地服务器收到微信回调数据并鉴签成功 // 数据以关联数组形式存放在$results中,是NotifyData对象的关联数组模式 file_put_contents("resultsdata.txt",var_export($results,true)); $out_trade_no = $results['out_trade_no']; // 这里执行您的系统逻辑,如修改订单状态,设置会员VIP状态等等... // 最后,给微信返回 "success" } else { // 如果失败,返回微信failed echo "failed"; } }); ```