美文网首页
微信支付JSAPI遇到的坑

微信支付JSAPI遇到的坑

作者: wyc0859 | 来源:发表于2019-02-22 12:25 被阅读0次

    这里没使用微信的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变量,它是个支付的json数据 前后端分离后,前端通过请求,获取jsApiParameters数据,替换掉即可。
    注意sdk中获取支付数据的过程中包含了openid的获取,记得删除

    支付部分的js,直接放入vue中也是可以使用的。
    WeixinJSBridge.invoke等方法是微信浏览器内部函数,只要是微信打开都可以调用。所以不需要引入任何外部js
    WeixinJSBridge内部使用vue方法也是可以执行的。如 that.router.push, 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遇到的坑

          本文链接:https://www.haomeiwen.com/subject/soasyqtx.html