如何对 微信支付结果通知 php 结果通知的内容做 签名验证

由于微信支付接口更新,本文档已过期,请查看新版微信支付教程。地址&
本文介绍如何使用JS API支付时如何获得交易通知。
一、交易通知
用户在成功完成支付后,微信后台通知(POST)商户服务器(notify_url)支付结果。商户可以使用notify_url的通知结果进行个性化页面的展示。
对后台通知交互时,如果微信收到商户的应答不是success或超时,微信不为通知失败,微信会通过一定的策略(如30分钟共8次)定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。
后台通知通过请求中的 notify_url 迚行,采用 POST 机制。
同时,在postData中还将包含xml数据。
二、交易结果获取与响应
根据官方文档,创建notice.php用于通知结果。
程序内容如下所示:
2 //方倍工作室
4 foreach ($_GET as $key=&$value)
logger("Key: $key; Value: $value");
8 $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
9 logger($postStr);
11 if (isset($_GET)){
echo "success";
15 //日志记录
16 function logger($log_content)
$max_size = 100000;
$log_filename = "log.xml";
if(file_exists($log_filename) and (abs(filesize($log_filename)) & $max_size)){unlink($log_filename);}
file_put_contents($log_filename, date('H:i:s')." ".$log_content."\r\n", FILE_APPEND);
上述程序的作用是
获取post到url的通知,他们以GET变量形式
获取post的XML数据包
返回成功消息 success
将notice.php的完整路径放入JS API支付的notice url中。
$wxPayHelper-&setParameter("notify_url", "http://www.doucube.com/wxpay/notice.php");
这样当交易完成后,该url将收到通知,并记录在日志文件中,我们的测试如下所示:
获得的GET变量及XML如下所示:
Key: bank_ Value: 085997
Key: bank_ Value: 2011
Key: Value: 0
Key: fee_ Value: 1
Key: input_ Value: GBK
Key: notify_ Value: Gx8ov6tT6_yaARrtKG6RFZ4KiVtKqVnJzvulFlteJ3dhBg38iRtKs0pTXXfgh8WnH15mIhG6j65ggbzzYguh1mutG3B5oHsK
Key: out_trade_ Value: JfuKdiBig4zZnE4n
Key: Value:
Key: product_ Value: 1
Key: Value: F7A36A9EA972C211C122362
Key: sign_ Value: MD5
Key: time_ Value: 39
Key: total_ Value: 1
Key: trade_ Value: 1
Key: trade_ Value: 0
Key: transaction_ Value: 3135
Key: transport_ Value: 0
&xml&&OpenId&&![CDATA[o0pk9uIVnlY-fJkzFKEbQ6LJ4cFc]]&&/OpenId&
&AppId&&![CDATA[wx0000]]&&/AppId&
&IsSubscribe&1&/IsSubscribe&
&TimeStamp&&/TimeStamp&
&NonceStr&&![CDATA[iOb2flJ0ILFAmBqJ]]&&/NonceStr&
&AppSignature&&![CDATA[aae680ba140e18e66d1295dfadabd9ab]]&&/AppSignature&
&SignMethod&&![CDATA[sha1]]&&/SignMethod&
而在微信窗口中将收到OK的弹出窗
交易通知成功搞定!
阅读(...) 评论()如何对 微信支付 结果通知的内容做 签名验证_百度知道
如何对 微信支付 结果通知的内容做 签名验证
我有更好的答案
方法/步骤 之前在调试微信支付的“统一下单”接口的时候一直遇到“签名错误”。网上查找了各种资料,一般可能是以下几个问题,如果大家出现此错误的话不妨挨个排查,以免浪费时间走弯路。
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。2017年2月 总版技术专家分月排行榜第三
2018年1月 .NET技术大版内专家分月排行榜第一2017年5月 .NET技术大版内专家分月排行榜第一2017年4月 .NET技术大版内专家分月排行榜第一2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
2017年2月 总版技术专家分月排行榜第三
2018年1月 .NET技术大版内专家分月排行榜第一2017年5月 .NET技术大版内专家分月排行榜第一2017年4月 .NET技术大版内专家分月排行榜第一2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
匿名用户不能发表回复!|在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
///////////////////////////问题已经解决//////////////////////微信支付的过程出现的问题 我写了一篇
有兴趣的可以看下
来源: 微信开放平台问答
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
$wx_sign['sign']
= $wxdata['sign'];
$wx_sign_all = $this-&wechatAppPay-&MakeSign($wx_sign);//调用签名函数
这里会把sign也加入签名串里面吧,sign应该是不参与签名的。
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。52131人阅读
微信公共帐号开发(11)
关于签名的算法,api提供的原文是:
1.签名算法
签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
 ◆ 参数名ASCII码从小到大排序(字典序); ◆ 如果参数的值为空不参与签名; ◆ 参数名区分大小写; ◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。 ◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key=(API密钥的值)得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
假设传送的参数如下:
appid: wxd930ea5d5a258f4f
device_info: 1000
body: test
nonce_str: ibuaiVcKdpRxkhJA
第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:
stringA=&appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=&nonce_str=ibuaiVcKdpRxkhJA&;
第二步:拼接API密钥:
stringSignTemp=&stringA&key=c09247ec02edce69f6a2d&
sign=MD5(stringSignTemp).toUpperCase()=&9A0AA9CF3B7&
网友的整理:
ok,根据这个我们来尝试一下看能够根据提供的参数得到这个结果【9A0AA9CF3B7】!!!!
关于按照ASCII排序这里用到了(SortedMap),我的上一篇blog说过的,有兴趣自己去看看
关键代码Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)
生成MD5的时候,需要统一编码,这里微信api要求是UTF-8
相关代码如下:
【MD5Util】
private static String byteArrayToHexString(byte b[]) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i & b. i++)
resultSb.append(byteToHexString(b[i]));
return resultSb.toString();
private static String byteToHexString(byte b) {
if (n & 0)
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
public static String MD5Encode(String origin, String charsetname) {
String resultString =
resultString = new String(origin);
MessageDigest md = MessageDigest.getInstance(&MD5&);
if (charsetname == null || &&.equals(charsetname))
resultString = byteArrayToHexString(md.digest(resultString
.getBytes()));
resultString = byteArrayToHexString(md.digest(resultString
.getBytes(charsetname)));
} catch (Exception exception) {
return resultS
private static final String hexDigits[] = { &0&, &1&, &2&, &3&, &4&, &5&,
&6&, &7&, &8&, &9&, &a&, &b&, &c&, &d&, &e&, &f& };
【PayTest】
//http://mch.weixin.qq.com/wiki/doc/api/index.php?chapter=4_3
private static String Key = &c09247ec02edce69f6a2d&;
* @param args
public static void main(String[] args) {
System.out.println(&&&&模拟微信支付&&&&);
System.out.println(&==========华丽的分隔符==========&);
//微信api提供的参数
String appid = &wxd930ea5d5a258f4f&;
String mch_id = &&;
String device_info = &1000&;
String body = &test&;
String nonce_str = &ibuaiVcKdpRxkhJA&;
SortedMap&Object,Object& parameters = new TreeMap&Object,Object&();
parameters.put(&appid&, appid);
parameters.put(&mch_id&, mch_id);
parameters.put(&device_info&, device_info);
parameters.put(&body&, body);
parameters.put(&nonce_str&, nonce_str);
String characterEncoding = &UTF-8&;
String weixinApiSign = &9A0AA9CF3B7&;
System.out.println(&微信的签名是:& + weixinApiSign);
String mySign = createSign(characterEncoding,parameters);
System.out.println(&我
的签名是:&+mySign);
if(weixinApiSign.equals(mySign)){
System.out.println(&恭喜你成功了~&);
System.out.println(&注定了你是个失败者~&);
String userAgent = &Mozilla/5.0(CPU iphone OS 5_1_1 like Mac OS X) AppleWebKit/534.46(KHTML,like Geocko) Mobile/9B206 MicroMessenger/5.0&;
char agent = userAgent.charAt(userAgent.indexOf(&MicroMessenger&)+15);
System.out.println(&微信的版本号:&+new String(new char[]{agent}));
* 微信支付签名算法sign
* @param characterEncoding
* @param parameters
@SuppressWarnings(&unchecked&)
public static String createSign(String characterEncoding,SortedMap&Object,Object& parameters){
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
Object v = entry.getValue();
if(null != v && !&&.equals(v)
&& !&sign&.equals(k) && !&key&.equals(k)) {
sb.append(k + &=& + v + &&&);
sb.append(&key=& + Key);
String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
【最终结果】
&&&模拟微信支付&&&
==========华丽的分隔符==========
微信的签名是:9A0AA9CF3B7
的签名是:9A0AA9CF3B7
恭喜你成功了~
微信的版本号:5
后期用真正的商家APPId整合再试试~~good}

我要回帖

更多关于 微信退款结果通知 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信