本文是对上篇文章的一个补充,主要是官方没有关于通知的demo,摸石头过河真的很难受,方便大家开发,放出来给大家看看

通知机制的实现,官方只有文档没有demo代码,对没搞过的人来说,需要花大量时间来做测试。

从文档上说的来看,微信每次通知过来的数据,结构比较复杂,是一个多段数据,除了要取出POST数据外,还要取其它的数据。

这里首先涉及到一个关于php://input与$_POST取值的问题,简单列几点如下:

1,Content- Type取值为application/x-www-form-urlencoded时,php会将http请求body相应数据会填入到数组$_POST,填入到$_POST数组中的数据是进行urldecode()解析的结果。(其实,除了该Content-Type,还有 multipart/form-data表示数据是表单数据,稍后我们介绍)

2,php://input数据,只要Content-Type不为 multipart/form-data(该条件限制稍后会介绍)。那么php://input数据与http entity body部分数据是一致的。该部分相一致的数据的长度由Content-Length指定。

3,仅当Content-Type为application/x-www-form-urlencoded且提交方法是POST方法时,$_POST数据与php://input数据才是”一致”(打上引号,表示它们格式不一致,内容一致)的。其它情况,它们都不一致。

4,php://input读取不到$_GET数据。是因为$_GET数据作为query_path写在http请求头部(header)的PATH字段,而不是写在http请求的body部分。

帮助我们了解了为什么xml_rpc服务端读取数据都是通过file_get_contents(‘php://input', ‘r')。

而不是从$_POST中读取,正是因为xml_rpc数据规格是xml,它的Content-Type是text/xml。

5. php://input碰到了multipart/form-data,请查阅RFC1867对它的描述。multipart/form-data也表示以POST方法提交表单数据,它还伴随了文件上传,所以会跟application/x- www-form-urlencoded数据格式不一样。它会以一更种更合理的,更高效的数据格式传递给服务端。当Content-Type为multipart/form-data的时候,即便http请求body中存在数据,php://input也为空,PHP此时,不会把数据填入php://input流。所以,可以确定: php://input不能用于读取enctype=multipart/form-data数据。

6. 当Content-Type为application/x- www-form-urlencoded时,php://input和$_POST数据是“一致”的,为其它Content-Type的时候,php: //input和$_POST数据数据是不一致的。因为只有在Content-Type为application/x-www-form- urlencoded或者为multipart/form-data的时候,PHP才会将http请求数据包中的body相应部分数据填入$_POST全局变量中,其它情况PHP都忽略。而php://input除了在数据类型为multipart/form-data之外为空外,其它情况都可能不为空

以上转述这么多文字的意思,就是说,得用到这两种方式来读取微信传过来的数据。

先取$POST 这是常规的支付通知信息,形如:

复制代码 代码示例:

array (

'bank_type' => '3006',

'discount' => '0',

'fee_type' => '1',

'input_charset' => 'UTF-8',

'notify_id' => 'YaNO6cznoNZK0aGb8nJWGgVUWssjt7Ze7gWRaRS0R_5w9oXgGNkRGxReEk0r45yk3I9a2_gzo9IqgqMYbap6bxC2T3p0o-2C',

'out_trade_no' => '1214284731',

'partner' => '12xxxxxxxx',

'product_fee' => '3400',

'sign' => '545FA0E8B594BBXXXX48XX142F084TY',

'sign_type' => 'MD5',

'time_end' => '20130223110224',

'total_fee' => '3400',

'trade_mode' => '1',

'trade_state' => '0',

'transaction_id' => '12XXX449012014XXX33174005XXX',

'transport_fee' => '0',

)

再用file_get_contents('php://input')读取额外的信息,形如:

复制代码 代码示例:

1

1400814743

最后,做相应的业务逻辑处理,不再详述,大家研究。

php微信支付怎么来测试_PHP微信支付通知处理方式实现方法相关推荐

  1. 微信小程序支付返回签名错误_PHP微信小程序支付——签名错误

    先分清几个概念:微信公众平台.微信开放平台.微信商户平台 1.微信公众平台.微信开放平台.微信商户平台是三个不同的平台 2.微信公众平台:用于公众号.小程序等等的设置平台,包括APPID.APPSEC ...

  2. php支付回调怎么写_php 微信支付回调校验的两种做法

    支付的时候设置了异步回调地址 微信回调返回的数据是xml 1 直接用post或者get是获取不到微信返回的数据,需要使用 file_get_contents("php://input&quo ...

  3. 微信上色盲怎么测试软件,微信还有这个隐藏功能:查视力,测色盲几步就搞定,太省事了...

    在当下,微信已经成为我们日常生活中不可或缺的一个社交工具了,它的功能也开始不断强大,带给我们越来越多的惊喜.近来小编发现微信中有一个神奇的小功能,可以帮我们轻松查视力.测色盲. 方法很简单:打开我们的 ...

  4. 微信小程序提供测试账号微信小程序开发注意事项

    小程序消息推送至公众号(服务号) 可以通过小程序openid推送到公众号(服务号),要求如下 小程序和公众号的主体需要保持一致 在公众号中需要关联小程序: 消息模板 消息模板库中的模板在不同公众号引用 ...

  5. java实现沙箱测试环境支付宝支付(demo)和整合微信支付和支付宝支付到springmvc+spring+mybatis环境全过程(支付宝和微信支付)

    一.支付宝测试环境代码测试 1.下载电脑网站的官方demo: 下载地址:https://docs.open.alipay.com/270/106291/ 2.下载解压导入eclipse readme. ...

  6. 线上支付同时支持支付宝和微信,关于退款问题的测试

    某一APP提交订单支付方式有支付宝和微信,提交订单选择支付方式后,付款失败,订单进入待支付订单列表.然后在待付款订单列表再次付款,系统会再次提供支付方式选择,付款成功后,后台管理系统可以进行退款操作. ...

  7. uniapp开发安卓APP测试实现微信支付(初学者都能轻松get)

    前提条件 上代码 打包运行 注意bug!! 这里我们是前后端各一个人测试,这里分享一点前端的代码知识以及我们在测试过程中遇到的bug 前提条件 首先我们要去微信开放平台申请微信开放APP的应用包名和应 ...

  8. 支付宝支付的过程 java_java实现沙箱测试环境支付宝支付(demo)和整合微信支付和支付宝支付到ssm环境全过程(附源码)...

    文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源. 一.支付宝测试环境代码测试 1.下载电脑网站的官方demo: 2.下载解压导入eclipse ...

  9. java实现沙箱测试环境支付宝支付(demo)和整合微信支付和支付宝支付到ssm

    源代码 https://github.com/OUYANGSIHAI/sihai-maven-ssm-alipay 一.支付宝测试环境代码测试 1.下载电脑网站的官方demo: 下载地址:https: ...

最新文章

  1. 安装eclipse时一直跳转JRE Missing页面
  2. 部署yum仓库自动挂载服务
  3. efi分区咋移动到c盘里_怎么手动安装CLOVER到U盘EFI分区
  4. mysql和sqlserver分页的区别_关于SQLServer和MySQL 查询分页语句区别
  5. 切换oracle用户impdp,Oracle 12c pdb使用expdp/impdp导入导出
  6. 彻底明白ip地址,区分localhost、127.0.0.1和0.0.0.0
  7. php怎么自己写框架,PHP学习笔记,自己动手写个MVC的框架
  8. python selenium 下拉列表_Selenium+Python之下拉菜单的定位
  9. 2014-5-19 思杨回来后的第一个周末,教训,痛并快乐着
  10. java生成随机数的代码_java随机数代码的三种生成方式怎么编写?
  11. 左耳朵耗子:你得知道,技术不是用来写 CRUD 的
  12. My Fifty-fifth Page - 子集 - By Nicolas
  13. Pytorch的一些小问题
  14. 虚幻蓝图实现只狼的钩索系统(2)-射线检测
  15. BlockingQueue(阻塞队列)详解
  16. 八、码元、波特、速率和带宽
  17. 安国论—富国篇:金融战争与美元霸权(1)
  18. python中callable什么意思_python中callable对象有什么用
  19. 汇编学习实战修改win32扫雷
  20. 自动锁螺丝机程序采用显控触摸屏加三菱FX3GA或者FX3U , 用PLC变址寄存器做配方,用D1000-D7999存储数据

热门文章

  1. QQweb登录通讯协议
  2. 诚之和:苹果被爱立信起诉要5G专利费 这下麻烦大了
  3. 解决:win10安装谷歌浏览器,双击快捷方式,没反应,打不开
  4. (ICASSP 2014)Small-footprint keyword spotting using deep neural networks
  5. java企业客户管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  6. 支付宝如何进军海外市场
  7. 复合函数用Matlab画图,一种快速理解抽象复合函数的作图方式
  8. 手机wifi已连接但无法访问互联网_手机已连接但无法访问互联网,碰到这个情况怎么破?想不到是这样...
  9. 思科网络设备 show version命令输出内容详解
  10. nacos+gateway服务发现lb路由报503 Service Unavailable