• PHP微信公众号JSAPI网页支付(下)


    上一篇PHP微信公众号JSAPI网页支付(上)中讲到了公众号平台的相关设置以及支付的大致流程。

    这一篇重点讲支付后,异步接受回调通知,以及处理后同步通知微信服务器。

    首先梳理下整个jsapi支付的流程

    1.网页授权获取用户openid

    2.使用统一下单支付接口,生成JSAPI页面调用的支付参数并签名。

    3.使用JSAPI调起支付

    4.支付后回调(包括接受异步通知以及做出同步处理)

    下面讲一些实际中踩到的坑,注意啦

    1.官方demo中的一些需要修改的地方

    1)打开lib文件夹下的WxPay.Api.PHP文件,在537行有一段curl网络请求配置代码:

    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验

    替换成

    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);//非严格校验

    另外说明下:

    在46-49行有一段代码:


    //异步通知url未设置,则使用配置文件中的url
    if(!$inputObj->IsNotify_urlSet()){
    $inputObj->SetNotify_url(WxPayConfig::NOTIFY_URL);//异步通知url

    对应的做法是在WxPay.Config.php 中加上这个配置,根据实际回调地址填写
    例如:const NOTIFY_URL="http://paysdk.weixin.qq.com/example/notify.php";

    2)打开lib文件夹下的WxPay.Notify.php文件,第79行的代码:
    if($needSign == true &&
    $this->GetReturn_code($return_code) == "SUCCESS")
    {
    $this->SetSign();
    }

    替换成

    if($needSign == true &&
    $this->GetReturn_code() == "SUCCESS")
    {
    $this->SetSign();
    }

    3)打开lib文件夹下的WxPay.JsApi.php文件,在99行有一段curl网络请求配置代码:


    curl_setopt($ch, CURLOPT_TIMEOUT, $this->curl_timeout);

    替换成

    curl_setopt($ch, CURLOPT_TIMEOUT, 30);  //此处可根据实际情况填写,单位(秒)

    2.支付回调验证链接,必须是没有权限验证的

    如果你填写的回调链接,还需要登录注册验证的,就不要尝试了,必须要可以无障碍访问的链接,而且也不要有一连串的参数传递。
    最好就是简单粗暴的[http://serverName/xxx.php]

    以ThinkPHP举例,比如在根目录下,类似于index.php,重新写了一个专门的供支付回调的入口文件payment.php,

    和它对应的Application/目录下的模块(WexinApi)、控制器(WeixinPay)及方法(notify)

    如图:payment.php

    纠正一下,上图最后引入ThinkPHP入口文件那句应该改成: require ‘./ThinkPHP/ThinkPHP.php’

    现在访问[http://serverName/payment.php],就会直接进入到[http://serverName/payment.php/WexinApi/WeixinPay/notify],


    这样回调验证链接可以写[http://serverName/payment.php],也可以写[http://serverName/payment.php/WexinApi/WeixinPay/notify]。

    支付完成,就会进入到之前写好的链接对应的方法

    说明:下面那个$data截图不完整,应该是$data=json_decode(json_encode(simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA)),true);

     这里有两个地方要注意:

    1)升级完PHP7 发现微信支付回调失败。原来是 $GLOBALS['HTTP_RAW_POST_DATA']没有定义的问题。php7 移除了这个全局变量。

    像下面这样写就要严谨一点:

         $xml = $GLOBALS['HTTP_RAW_POST_DATA'];//这里在php7下不能获取数据,使用 php://input 代替  

            if(!$xml){  

                $xml = file_get_contents("php://input");  

          } 

    或者直接写$xml=file_get_contents("php://input");

    2)此处file_put_contents(日志文件路径,$xml,FILE_APPEND),linux下,这个地方最好写全局路径:/data/wwwroot/...

    为了安全起见,对返回过来的签名,要重新验证:

    参考文章:http://blog.csdn.net/sinat_35861727/article/details/72783988

  • 相关阅读:
    数论小结转载
    hdu 3792 二分
    求N的所有因子(约数)
    整数划分 --- 一个老生长谈的问题 动态规划
    hdu 1541 Stars poj 1195 Mobile phones(二维) poj 2155 Matrix(二维) hdu 3584 Cube(三维) 树状数组
    zoj 3175 Number of Containers
    asp.netMVC中权限控制论
    asp.net下使用Cookie保存登录信息
    asp.netMVC中实现分页方法
    asp.net异步上传
  • 原文地址:https://www.cnblogs.com/hld123/p/7435366.html
Copyright © 2020-2023  润新知