微信支付退款发起通知显示退款通知可却没有这个人什么回事

研究微信开发一年多了,每个新接口,都会第一时间进行研究。微信支付开放很久,一直没机会接触到支付接口,等了好久终于从朋友那儿搞到了接口,从此开始了我两天多的支付接口的研究。
拿到这个接口文档的第一个想法就是这也没什么难的嘛, 和支付宝、财付通、网银在线等一些传统接口的思路逻辑都是一样的,觉得差不多最多一个下午就可以搞定,结果第一步调用统一支付接口就给来了个下马威,不管怎么改,就一直返回签名错误。第一次遇到签名错误,首先想到的是应该是没有正确理解签名的生成规则,又从头看了几次签名的生成规则,每次都是的理解都是一样的,试了改几次还是不行。 这一次已经开始怀疑腾讯的文档写的有问题,一边找其他资料一边在心里骂腾讯写文档的作者。在园子里看到了到处都是坑的微信支付V3后,更加确认是微信的文档的问题。现在想想当时的想法太幼稚了,大部分自信心爆棚的人,在遇到解决不了的问题时总是会怀疑是不是别人给的东西不对,而不会从自身找问题,一句话总结就是一到便秘就怪地球没引力。(各位看官请勿对号入座,纯属个人见解,勿喷)。
现在说正题。。
从开始遇到错误到最后解决签名的问题,总结的问题就是我在生成签名的时候把参数进行了编码,而官方给的开发文档并没有说要做url编码,另外一个就是我进入了一个死胡同,总觉得自己的理解与实现过程没有问题,但最后当我把之前写的代码完全放弃,推倒重做后,问题终于解决。兴奋之极。下面从头说下我的理解与解决方法。
官方文档中接口调用规则:
?& 认证方式:HTTPS 认证,退款和冲正接口调用需要商户证书(证书在审核邮件附件
?& 请求采用 POST 方式
?& 提交和返回结果采用 XML 格式
?& 字符集默认使用 UTF-8,请勿使用其它字符集
?& 商户与微信之间的交互(特别是 Native 回调和支付通知回调),都需要验证签名
?& 处理返回时先判断协议返回错误码,再判断业务返回错误码,最后判断交易状态
下面是官方的签名生成方法
a.对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)后,使用 URL 键值对的格式(即 key1=value1&key2=value2…)拼接成字符串 string1,注意:值为空的参数不参与签名;
b. 在 string1 最 后 拼 接 上 key=Key( 商 户 支 付 密 钥 ) 得 到 stringSignTemp 字 符 串 , 并 对 stringSignTemp 进行 md5 运算,再将得到的字符串所有字符 转换为大写,得到 sign 值
下面是我所理解的签名生成规则:
1,所有的参数都是小写的
2,参数的值不需要做任何处理,包括url编码
3,确保必须的参数不能为空,且是正确无误的。
下面是示范过程:
要传入的参数分别为:appid,mch_id,nonce_str,body,attach,out_trade_no,total_fee,spbill_create_ip,notify_url,trade_type,openid(jsapi必须)&,product_id(native必须)。
首先将键值对存入&Dictionary&string,string&中,其次根据key值升序排序,代码如下:& & var dictemp = dic.OrderBy(d =& d.Key);
然后将键值对转换成url形式后,在末尾链接上key值,例如:appid=****&attach=****…………&key=******,最后进行md5加密并将加密后的字符串转换成大写。这里需要特别注意的是,md5加密是需要将字符集转换成utf-8,否则中文商品描述会出现乱码。
public static string MD5(string pwd)
MD5 md5 = new MD5CryptoServiceProvider();
byte[] data = System.Text.Encoding.UTF8.GetBytes(pwd);
byte[] md5data = puteHash(data);
md5.Clear();
string str = &&;
for (int i = 0; i & md5data.L i++)
str += md5data[i].ToString(&x&).PadLeft(2, '0');
生成签名后将sign=签名 &键值对添加到生成签名时生成的dictemp中,然后将dictemp转换成xml,post到,返回值也是xml,最后对xml进行解析,为了保证安全性,需将解析后的键值对进行签名校验。
1 &xml&&appid&&![CDATA[******]]&&/appid&&mch_id&&![CDATA[******]]&&/mch_id&&nonce_str&&![CDATA[b48cfbebd4c9df66f0e47]]&&/nonce_str&&body&&![CDATA[神六]]&&/body&&out_trade_no&&![CDATA[ggggg673526]]&&/out_trade_no&&total_fee&&![CDATA[1000000]]&&/total_fee&&spbill_create_ip&&![CDATA[59.174.203.41]]&&/spbill_create_ip&&notify_url&&![CDATA[http://wxpay.ttyouni.net/aspx/order/notify.aspx]]&&/notify_url&&trade_type&&![CDATA[JSAPI]]&&/trade_type&&openid&&![CDATA[ozJkDj6yXuUsxIgS4xiJbtZMv2XQ]]&&/openid&&sign&&![CDATA[7CBA5A6BFF210BDA8C1AA33E9D803711]]&&/sign&&/xml&
校验签名无误后,下一步就是取出预支付id&prepay_id,然后调用微信支付js,注意:调用微信支付js之前也需要将所有参与调用的参数进行签名,且这里的参与签名的参数需要验证遵守大小写(腾讯有的时候真的很脑残,一会全小写,一会有大写有小写)。生成签名后就可以调用微信支付js了,代码如下:
1 var WxPay= {
Pay: function (appId, timeStamp, nonceStr, package, signType, paySign,callback) {
WeixinJSBridge.invoke('getBrandWCPayRequest', {
&appId&: appId,
//公众号名称,由商户传入
&timeStamp&:timeStamp,
//时间戳,自 1970 年以来的秒数
&nonceStr&: nonceStr, //随机串
&package&: package,
&signType&: signType,
//微信签名方式
&paySign&: paySign //微信签名
}, function (res) {
if (res.err_msg == &get_brand_wcpay_request:ok&) {
callback();
// 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg 将在用户支付成功后返回 ok,但并不保证它绝对可靠。
为了方便调用,我将微信支付js写到了一个单独的js文件,然后在页面中载入,生成签名用ajax调用。调用代码如下:
1 &script&
$(function () {
$(&#submit&).click(function () {
$.get(&WxPay.ashx?action=jspayparam&, {
body: $(&#body&).val(),
total_fee: $(&#price&).val(),
out_trade_no: $(&#order&).val(),
trade_type: &JSAPI&,
msgid:&&%=openid%&&
}, function (data) {
WxPay.Pay(data.appId, data.timeStamp, data.nonceStr, data.package, data.signType, data.paySign, function () {
alert(&支付成功&);
}, &json&);
这里我只传入了一些和商品相关的参数,其他和商品无法的参数写到了后台代码中。后台收到请求后,将appid,mch_id等参数拼接成键值对进行进一步的处理,然后将处理后的结果返回给前台。
void GetJsPayParam(HttpContext context)
JsEntities jsEntities = new JsEntities()
appId = appid,
nonceStr = WxPayHelper.Utils.GetRandom(),
package = string.Format(&prepay_id={0}&, GetPrepayId(context)),
signType = &MD5&,
timeStamp = WxPayHelper.Utils.ConvertDateTimeInt(DateTime.Now).ToString()
string url,
WxPayHelper.Utils.GetUnifyUrlXml&JsEntities&(jsEntities, key, out url, out sign);
jsEntities.paySign =
context.Response.Write(JsonConvert.SerializeObject(jsEntities));
下面是生成键值对的方法,由于请求支付的过程中,到处需要生成签名,所以我将各个请求参数都写成了一个个类,然后使用泛型类和反射动态生成字典键值对,请求url和xml。代码如下:
public static string GetUnifyUrlXml&T&(T t,string key,out string url,out string _sign)
Type type = typeof (T);
Dictionary&string,string& dic = new Dictionary&string, string&();
PropertyInfo[] pis = type.GetProperties();
#region 组合url参数到字典里
foreach (PropertyInfo pi in pis)
object val = pi.GetValue(t, null);
if (val != null)
dic.Add(pi.Name, val.ToString());
#endregion
//字典排序
var dictemp = dic.OrderBy(d =& d.Key);
#region 生成url字符串
StringBuilder str = new StringBuilder();
foreach (var item in dictemp)
str.AppendFormat(&{0}={1}&&, item.Key, item.Value);
#endregion
var ourl= str.ToString().Trim('&');
string tempsign = ourl + &&key=&+
//md5加密后,转换成大写
string sign = MD5(tempsign).ToUpper();
//将签名添加到字典中
dic.Add(&sign&, sign);
url = str.AppendFormat(&sign={0}&,sign).ToString();
//生成请求的内容,并返回
return parseXML(dic);
& 到这里应该就可以满足jsapi的需求了, 后期会将native和其他接口分享给大家。
如果你觉得本文对你有帮助,请大方的扫下面的二维码悬赏一下吧。
新建了个微信支付及微信开发的QQ群,欢迎大家加入一起交流微信开发技术。微信支付之后想申请退款但是联系不到商家怎么办_百度知道
微信支付之后想申请退款但是联系不到商家怎么办
提问者采纳
没收到货之前你的钱是第三方由保管。所以你只要申请退款就可以了
提问者评价
知道智能回答机器人
我是知道站内的人工智能,可高效智能地为您解答问题。很高兴为您服务。
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁微信提现没到账,退款通知看电到,但钱没在微信红包那怎么办_百度知道
微信提现没到账,退款通知看电到,但钱没在微信红包那怎么办
提问者采纳
打开面板右下角的“我”,这里面可以看到每一笔进账和出账的明细的.,再点击“钱包”,就会,在打开的窗口中点击右上角的“零钱明细”,然后再点击“钱包”。如果到账了,再点击“零钱”.这个是需要看钱包里面的钱有没有多的,可以通过零钱明细来进行查询
其他类似问题
为您推荐:
红包的相关知识
其他1条回答
你点击它就会弹出一个带有条形码和二维码的页面你好,支持微信支付的药房一般都备有扫码枪或专用摄像头,你先到药房选好要购买的药。 这时候你打开微信,找到我-钱包-我的钱包,里面有个“刷卡”,然后到柜台结算
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 支付宝退款多久到账 的文章

更多推荐

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

点击添加站长微信