要实现公众号支付功能,前提已经完成了[微信平台支付配置](微信平台支付配置.md) ## 第一步:生成订单 传递商品信息,自动生成订单相关参数 ~~~ $appid = '你的公众号appid'; $product = [ 'openid'=>'微信用户在商户对应appid下的唯一标识', 'body'=>'商品简单描述', 'out_trade_no'=>'商户系统内部订单号,要求32个字符内、且在同一个商户号下唯一', 'total_fee'=>'订单总金额,单位为元' ]; $callback = '支付成功后的异步回调地址'; $pay = D('Common/Payment')->jsapi_pay($appid, $product, $callback); if ($pay['status'] == 0) { $this->error($pay['msg']); } $this->assign('pay', $pay); //支付成功后页面跳转的地址 $this->assign('jump_url', U('show_success')); ~~~ prodect数组是传递最基本的商品参数,同时也支持传递更多微信支付里的[统一下单](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1)接口里的参数 参数body请按照规范传递,具体请见[参数规则](https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=4_2) 其中callback回调地址的格式:应用名/model类名/方法名,如:weixin/Service/payok 而jump_url是支付成功后页面跳转的地址,一般是提示成功的界面 >[info] callback与jump_url是区别是:callback是用来接收微信异步提交的支付结果,可用于判断是否成功支付;而jump_url仅用于页面跳转,不可用于判断支付成功与否 ## 第二步:前端显示支付按钮 在前端显示支付按钮,用户点击此按钮就可以进入支付流程 ~~~ <a href="javascript:void(0)" class="btn" onclick="doPay()">确认结算</a> <script type="text/javascript"> function jsApiCall(){ WeixinJSBridge.invoke( 'getBrandWCPayRequest', { "appId":"{$pay.appId}", //公众号名称,由商户传入 "timeStamp":"{$pay.timeStamp}", //时间戳,自1970年以来的秒数 "nonceStr":"{$pay.nonceStr}", //随机串 "package":"{$pay.package}", "signType":"{$pay.signType}", //微信签名方式: "paySign":"{$pay.paySign}" //微信签名 }, function(res){ if(res.err_msg == "get_brand_wcpay_request:ok" ) { window.location.href = "{$jump_url}"; } } ); } function doPay(){ 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() } } </script> ~~~ ## 第三步:异步接收支付结果 参考 [异步接收支付结果](异步接收支付结果.md) # 常见问题 ## 支付验证签名失败 ![](https://box.kancloud.cn/63703f0a6bef420afcc03f83a10464f7_720x1280.png =300x533) 正常情况下,WeiPHP系统的支付功能都已经验证测试过,如果出现此问题基本是API密钥不对的原因 ## 当前页面的url未注册 微信公众平台里的支付配置中的支付目录设置为:http://您的网址/ (如http://www.weiphp.cn/) 原因1:URL的路由模式不对,如以下两个网址都可以正常访问,微信支付会误认为第一个网址的目录应该到jsapi http://您的网址/index.php/weixin/payment/jsapi (错误的地址) http://您的网址/index.php?s=/weixin/payment/jsapi (正确的地址) 原因2:当前页面对应的目录确实没有支付目录中配置,需要按照前面章节 [微信平台支付配置](微信平台支付配置.md) 进行配置