微信支付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方法底部执行自定义业务处理

你可能感兴趣的:(微信支付JSAPI遇到的坑)