上一篇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,);  //此处可根据实际情况填写,单位(秒)

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

PHP微信公众号JSAPI网页支付(下)的更多相关文章

  1. PHP微信公众号JSAPI网页支付(上)

    一.使用场景以及说明 使用场景:商户已有H5商城网站,用户通过消息或扫描二维码在微信内打开网页时,可以调用微信支付完成下单购买的流程. 说明:1.用户打开图文消息或者扫描二维码,在微信内置浏览器打开网 ...

  2. 微信公众号JSAPI支付

    微信公众号JSAPI支付 一:配置参数 申请成功后,获取接口文件, 将所有文件放入项目根目录weixin下,在WxPay.ub.config.php中填入配置账户信息; 二:设置授权 开发者中心-&g ...

  3. java微信公众号JSAPI支付以及所遇到的坑

    上周做了个支付宝微信扫码支付,今天总结一下.微信相比支付宝要麻烦许多 由于涉及到代理商,没办法,让我写个详细的申请流程,懵逼啊. 笔记地址 http://note.youdao.com/notesha ...

  4. 微信公众号JSAPI支付-多公众号向同一商户号支付的问题解决

    一.背景 项目提供公众号商城集成,在公众号里进行商品的购买,并与多家公众号合作增加渠道流量. . 二.实现 有关微信公众号.商户号的开通与支付绑定不细说 从背景里可知,我们需要实现多个公众号购买向同一 ...

  5. PHP应用如何对接微信公众号JSAPI支付

    微信支付的产品有很多,1. JSAPI支付  2. APP支付  3. Native支付  4.付款码支付  5. H5支付. 其中基于微信公众号开发的应用选择“JSAPI支付“产品,其他APP支付需 ...

  6. 网站如何接入微信公众号JSAPI支付PHP版

    1.首先,我们要有一个微信公众号(分类类型有订阅号,服务号,企业号)我们的微信公众号一定是个服务号只有它才有微信支付接口.. 并且这个微信公众号一定要进行微信认证才能申请微信支付接口. 2.申请JSA ...

  7. 微信公众号授权,支付,退款总结【shoucang】

    1.支付前准备 1.1首先两个平台接入账户. 商户平台:https://pay.weixin.qq.com/index.php/core/home/login?return_url=%2F 公众平台: ...

  8. thinkphp5.0 微信公众号接入支付宝支付

    ---恢复内容开始--- 真是无力吐槽这个需求了,想骂客户,好端端的非要在微信公众号接入支付宝,都知道微信公众号是拒绝支付宝的,屏蔽了支付宝,所以在微信公众号接入支付宝的话就必须手动复制链接跳出微信内 ...

  9. php 微信公众号接入支付宝支付

    真是无力吐槽这个需求了,好端端的非要在微信公众号接入支付宝,都知道微信公众号是拒绝支付宝的,屏蔽了支付宝,所以在微信公众号接入支付宝的话就必须手动复制链接跳出微信内置浏览器,强制性打开web浏览器完成 ...

随机推荐

  1. 在 Xshell 中 使用 hbase shell 进入后 无法删除

    在 Xshell 中 使用 hbase shell 进入后 无法删除 问题: 在hbase shell下,误输入的指令不能使用backspace和delete删除,使用过的人都知道,这是有多坑,有多苦 ...

  2. 为什么要使用TypeScript开发Web应用程序

    TypeScript仍然相对较新,但已经赢得了很多信徒.继续阅读,看看这种很酷的语言的一些最好的功能. 定义TypeScript TypeScript是由Microsoft Corporation开发 ...

  3. 解决OrangePi 耳机孔没有声音

    遇到过插入耳机后没有声音,解决步骤如下: 打开终端TERMINAL(LUBUNTU按CTRL+ALT+T,MATE选SYSTERM ADMINSTRATION-MATER TERMINAL),SSH登 ...

  4. 将代码托管到github服务器之SSH验证

    内容中包含 base64string 图片造成字符过多,拒绝显示

  5. Bubble Babble Binary Data Encoding的简介以及bubblepy的安装使用方法

    Bubble Babble Binary Data Encoding是由Antti Huima创建的一种编码方法,可以把二进制信息表示为由交替的元音和辅音组成的伪词(pseudo-words),主要用 ...

  6. Java的get、post请求

    URLConnection package com.shuzf.http; import java.io.BufferedReader; import java.io.IOException; imp ...

  7. vue中使用LESS、SASS、stylus

    less的使用 npm install less less-loader --save 修改webpack.config.js文件.vue.cli 搭建项目可跳过此步 { test: /\.less$ ...

  8. [硬件]超能课堂(181):我们为什么需要4+8pin CPU供电接口?

    超能课堂(181):我们为什么需要4+8pin CPU供电接口? https://www.expreview.com/68008.html 之前算过TDP 来计算机器的功耗 发现自己 理解的还是有偏差 ...

  9. vue.js实战——方法设置默认参数

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. red()、redinle()、redlines()三者之间的关系

    # 关于read()方法: # 1.读取整个文件,将文件内容放到一个字符串变量中 # 2.如果文件大于可用内存,不可能使用这种处理 file_object = open("a.txt&quo ...