http://www.cnblogs.com/zskbll/p/wxpay.html

研究微信开发一年多了,每个新接口,都会第一时间进行研究。微信支付开放很久,一直没机会接触到支付接口,等了好久终于从朋友那儿搞到了接口,从此开始了我两天多的支付接口的研究。

拿到这个接口文档的第一个想法就是这也没什么难的嘛, 和支付宝、财付通、网银在线等一些传统接口的思路逻辑都是一样的,觉得差不多最多一个下午就可以搞定,结果第一步调用统一支付接口就给来了个下马威,不管怎么改,就一直返回签名错误。第一次遇到签名错误,首先想到的是应该是没有正确理解签名的生成规则,又从头看了几次签名的生成规则,每次都是的理解都是一样的,试了改几次还是不行。 这一次已经开始怀疑腾讯的文档写的有问题,一边找其他资料一边在心里骂腾讯写文档的作者。在园子里看到了到处都是坑的微信支付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,否则中文商品描述会出现乱码。

 md5加密

生成签名后将sign=签名  键值对添加到生成签名时生成的dictemp中,然后将dictemp转换成xml,post到https://api.mch.weixin.qq.com/pay/unifiedorder,返回值也是xml,最后对xml进行解析,为了保证安全性,需将解析后的键值对进行签名校验。

 正确的xml

校验签名无误后,下一步就是取出预支付id prepay_id,然后调用微信支付js,注意:调用微信支付js之前也需要将所有参与调用的参数进行签名,且这里的参与签名的参数需要验证遵守大小写(腾讯有的时候真的很脑残,一会全小写,一会有大写有小写)。生成签名后就可以调用微信支付js了,代码如下:

 微信支付js

为了方便调用,我将微信支付js写到了一个单独的js文件,然后在页面中载入,生成签名用ajax调用。调用代码如下:

 支付js调用

这里我只传入了一些和商品相关的参数,其他和商品无法的参数写到了后台代码中。后台收到请求后,将appid,mch_id等参数拼接成键值对进行进一步的处理,然后将处理后的结果返回给前台。

 获取js支付参数

下面是生成键值对的方法,由于请求支付的过程中,到处需要生成签名,所以我将各个请求参数都写成了一个个类,然后使用泛型类和反射动态生成字典键值对,请求url和xml。代码如下:

 生成键值对,url,xml

到这里应该就可以满足jsapi的需求了, 后期会将native和其他接口分享给大家。

如果你觉得本文对你有帮助,请大方的扫下面的二维码悬赏一下吧。

新建了个微信支付及微信开发的QQ群,欢迎大家加入一起交流微信开发技术。

坑爹的微信支付v3,其实没有那么坑的更多相关文章

  1. 到处都是坑的微信支付V3

    业务需要一个在微信上能付款的功能,于是乎想到了最普遍的支付宝,坑爹的是T与A是水火不容啊,默默的还是接微信支付吧,没想到从此掉进了连环坑…… 网上写微信支付接口的还是很多,PHP官方有(鄙视源码作者, ...

  2. 到处都是坑的微信支付V3之 微信支付回调页面

    据上次 到处都是坑的微信支付V3 后很多园友在被虐了千百遍后终于跳转到了亲切的微信支付界面,但输入密码支付后却不知道怎么处理了,接下来补上支付后的处理流程. 1. html中根据前台支付后反馈信息成功 ...

  3. 微信支付v3发布到iis时的证书问题(转)

    本文纯粹转载(原地址:微信支付v3发布到iis时的证书问题 ) 一开始报“出现了内部错误” 解决方法是 方法一 var cer = new X509Certificate(certpath, pass ...

  4. 微信支付[v3]

    原文:微信支付[v3] V2升级V3 顺便记录一下 ,文档: http://pay.weixin.qq.com/wiki/doc/api/index.html !!! 支付授权目录与测试人的微信帐号白 ...

  5. 微信支付v3开发(5) 扫码并输入金额支付

    关键字:微信支付 微信支付v3 动态native支付 统一支付 Native支付 prepay_id 作者:方倍工作室 本文介绍微信支付下的扫描二维码并输入自定义金额的支付的开发过程. 注意 微信支付 ...

  6. 为了Java微信支付V3开发包,我找出了微信支付文档至少六个错误

    1. 前言 最近忙的一批,难得今天有喘气的机会就赶紧把最近在开发中的一些成果分享出来.前几日分享了自己写的一个微信支付V3的开发包payment-spring-boot-starter,就忙里偷闲完善 ...

  7. 如何在Spring Boot项目中集成微信支付V3

    Payment Spring Boot 是微信支付V3的Java实现,仅仅依赖Spring内置的一些类库.配置简单方便,可以让开发者快速为Spring Boot应用接入微信支付. 演示例子: paym ...

  8. Payment Spring Boot 1.0.4.RELEASE 发布,最易用的微信支付 V3 实现

    Payment Spring Boot 是微信支付V3的Java实现,仅仅依赖Spring内置的一些类库.配置简单方便,可以让开发者快速为Spring Boot应用接入微信支付. 欢迎ISSUE,欢迎 ...

  9. 微信支付V3 SDK Payment Spring Boot 1.0.6 发布,实现留守红包,助力抗疫

    春节将至,为防控疫情,多地政府提倡员工.外来务工者留守本地过年,并鼓励企业向员工发放"留守红包".为此,微信支付推出"春节留守红包"能力,希望可以协助有发放需求 ...

随机推荐

  1. C++ 模版

    函数模版 #include <iostream> using namespace std; template<typename T> T add(T t1, T t2) { r ...

  2. [LeetCode] Assign Cookies 分点心

    Assume you are an awesome parent and want to give your children some cookies. But, you should give e ...

  3. [LeetCode] Sum of Two Integers 两数之和

    Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Exam ...

  4. 使用WCF传输DataTable:DataTable和Xml格式的字符串相互转换(C#)

    背景:项目中要用到客户端向服务端传数据,使用WCF,绑定webHttpBinding,做了一个小例子. 业务逻辑简介:客户端在a表中添加了几条数据,从SQL Server数据库直接取出新添加的数据(D ...

  5. ASP.NET - Web API,从简单类型到复杂类型的参数传递用例,以及传递简单string类型的解决办法

    一,简单类型的传值 比如 public Users Get(int id) ,它可以使用两种方式获取: api/default/ $.get("/api/default",{id: ...

  6. JavaScript模板引擎artTemplate.js——结语

    再次首先感谢模板的作者大神,再次放出github的地址:artTemplate性能卓越的js模板引擎 然后感谢博客园的一位前辈,他写的handlebars.js模板引擎教程,对我提供了很大的帮助,也是 ...

  7. DataSet与DataTable与DataRow的关系

    1. 添加数据: DataRow dr=MyDataSet.Tables["User"].NewRow(); dr["UserName"] = "张三 ...

  8. 使用markdown

    一.在windows下使用markdown MarkdownPad:MarkdownPad is a full-featured markdown editor for windows. Awsomi ...

  9. windows中LNK文件打开方式恢复(每日一修(1))

    相信有些用户曾试过错误地把LNK文件的打开方式更改其他文件,导致系统所有的快捷方式都失效.在vista与Windows7系统还不普遍使用的时候,相信大家会有点惊慌失措,不要紧,下面只要大家进行如下操作 ...

  10. 【poj2154】 Color

    http://poj.org/problem?id=2154 (题目链接) 题意 n个珠子的项链,可以染上n中颜色,项链可以旋转不能翻转,求染色方案数. Solution 经典的公式: \begin{ ...