浅析PHP微信支付通知的处理方式


Posted in PHP onMay 25, 2014

通知机制的实现,官方只有文档没有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')读取额外的信息,形如:

<xml><OpenId><![CDATA[o0pd3jqHaN7b0tVPDFJPzJEkSCLw]]></OpenId>
<AppId><![CDATA[wxXXX06XX2cXXX88XX]]></AppId>
<IsSubscribe>1</IsSubscribe>
<TimeStamp>1400814743</TimeStamp>
<NonceStr><![CDATA[lqxwMsiY9EXRDpms]]></NonceStr>
<AppSignature><![CDATA[c2dxxxe186116b32b06axxxc1a688b671eexxx5e]]></AppSignature>
<SignMethod><![CDATA[sha1]]></SignMethod>
</xml>

最后,做相应的业务逻辑处理,就不详述了。

PHP 相关文章推荐
十天学会php之第八天
Oct 09 PHP
PHP 向右侧拉菜单实现代码,测试使用中
Nov 03 PHP
php下封装较好的数字分页方法
Nov 23 PHP
无法载入 mcrypt 扩展,请检查 PHP 配置终极解决方案
Jul 18 PHP
php切割页面div内容的实现代码分享
Jul 31 PHP
php单例模式实现(对象只被创建一次)
Dec 05 PHP
php获取汉字首字母的函数
Nov 07 PHP
php操作MongoDB基础教程(连接、新增、修改、删除、查询)
Mar 25 PHP
php使用glob函数快速查询指定目录文件的方法
Nov 15 PHP
PHP中each与list用法分析
Jan 08 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
Dec 13 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
Apr 04 PHP
PHP开发微信支付的代码分享
May 25 #PHP
php定时计划任务与fsockopen持续进程实例
May 23 #PHP
PHP+Mysql+Ajax+JS实现省市区三级联动
May 23 #PHP
PHP解析html类库simple_html_dom的转码bug
May 22 #PHP
浅谈discuz密码加密的方式
May 22 #PHP
PHP函数strip_tags的一个bug浅析
May 22 #PHP
PHP学习笔记之字符串编码的转换和判断
May 22 #PHP
You might like
PHP脚本的10个技巧(8)
2006/10/09 PHP
PHP编实现程动态图像的创建代码
2008/09/28 PHP
对PHP依赖注入的理解实例分析
2016/10/09 PHP
php实现支付宝当面付(扫码支付)功能
2018/05/30 PHP
JavaScript 继承机制的实现(待续)
2010/05/18 Javascript
理解JSON:3分钟课程
2011/10/28 Javascript
JavaScript利用正则表达式去除日期中的-
2014/06/09 Javascript
jQuery实现简单二级下拉菜单
2015/04/12 Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
2017/06/13 Javascript
Webpack实战加载SVG的方法
2017/12/26 Javascript
vue项目中引入noVNC远程桌面的方法
2018/03/05 Javascript
深入了解JavaScript代码覆盖
2019/06/13 Javascript
layui radio单选限制下一个radio单选的实例
2019/09/03 Javascript
vscode+gulp轻松开发小程序的完整步骤
2020/10/18 Javascript
微信小程序picker组件两列关联使用方式
2020/10/27 Javascript
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
Python数据拟合与广义线性回归算法学习
2017/12/22 Python
Python使用while循环花式打印乘法表
2019/01/28 Python
python异常处理和日志处理方式
2019/12/24 Python
美国女性运动零售品牌:Lady Foot Locker
2017/05/12 全球购物
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
机电专业毕业生求职信
2013/10/27 职场文书
大专应届生个人的自我评价
2013/11/21 职场文书
小学生防溺水广播稿
2014/01/12 职场文书
幼教简历自我评价
2014/01/28 职场文书
关于期中考试的反思
2014/02/02 职场文书
单位消防安全责任书
2014/07/23 职场文书
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
5.12护士节活动总结
2015/02/10 职场文书
党小组考察意见
2015/06/02 职场文书
团拜会主持词
2015/07/04 职场文书
服装店员工管理制度
2015/08/07 职场文书
《我要的是葫芦》教学反思
2016/02/18 职场文书
Java spring定时任务详解
2021/10/05 Java/Android
SQL Server表分区删除详情
2021/10/16 SQL Server
国际最新研究在陨石中发现DNA主要成分 或由陨石带来地球
2022/04/29 数码科技