微信支付JSAPI遇到的坑
这里没使用微信的js-sdk,因为js-sdk要在前端wx.config中配置公众号信息,jsapi版相对也要简单些,其各有优势
本文讨论的是jsapi-php版
2019-2-22下载的微信jsapi-php版
一如既往的,不可能配置好参数就能支付成功的微信坑,记录下遇到的问题
- 报错:time_expire时间过短
- 报错:jsapi支付必须传openid
- 报错:$curl_timeout
- 报错:目录不对
- 可以支付成功,但会提示NaN
- 前后端分离如何支付
- 支付成功后接收不到回调数据
首先配置参数:example/WxPay.Config.php 中配置appid、AppSecret、Key、MCHID
访问jsapi页面提示time_expire时间过短
解决办法:
屏蔽jsapi.php中如下代码
$input->SetTime_expire(date("YmdHis", time() + 600));
报错: jsapi支付必须传openid
报错: $curl_timeout
两个都是同一个解决办法:
修改WxPay.JsApiPay.php中 $this->curl_timeout 为 30
curl_setopt($ch, CURLOPT_TIMEOUT, $this->curl_timeout);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
报错: 目录不对
这就不是微信坑了,是自己疏忽,忘记商户平台配置授权目录了
无论你路径再深,支付授权目录设置根域名即可,如http://www.xx.com/ 只需注意https还是http
到这里就可以支付成功了,剩下的就是回调更新的问题
报错: NaN
解决办法:
删除jsapi.php的JS部分代码中,获取共享地址的部分
前后端分离如何支付,vue中如何调用,及判断支付结果
从jsapi.php的JS部分可以看出,主要是jsApiParameters数据,替换掉即可。
注意sdk中获取支付数据的过程中包含了openid的获取,记得删除
支付部分的js,直接放入vue中也是可以使用的。
WeixinJSBridge.invoke等方法是微信浏览器内部函数,只要是微信打开都可以调用。所以不需要引入任何外部js
WeixinJSBridge内部使用vue方法也是可以执行的。如 that.toast("支付成功!") 等
jsApiCall(json) {
const that=this
WeixinJSBridge.invoke(
"getBrandWCPayRequest",
json,
function(res) {
WeixinJSBridge.log(res.err_msg);
if(res.err_msg == "get_brand_wcpay_request:ok"){
that.$toast("支付成功!");
}else if(res.err_msg == "get_brand_wcpay_request:cancel"){
that.$toast("取消支付");
}else{
that.$toast("支付失败");
}
setTimeout(()=>{
that.$router.push("/order-all");
},1000)
}
);
},
支付成功后接收不到回调数据
1、回调是post请求类型
2、sdk中使用的是$GLOBALS['HTTP_RAW_POST_DATA']接收数据,php5.3以上以弃用该方法
之前就上过一次当,时间长了,再次使用,又中招....
解决办法,将WxPayApi中两处$GLOBALS['HTTP_RAW_POST_DATA'] 替换成 file_get_contents('php://input')
$post=file_get_contents('php://input');
if (!isset($post)){
return false;
}
回调--自定义业务处理
继承WxPayNotify类,覆写NotifyProcess方法
或者直接用sdk中notify.php,在NotifyProcess方法底部执行自定义业务处理