微信支付产品

在这里,微信提供几种支付产品,本文要讲解的是Native支付,也就是我们所说的扫码支付,只要了解一种支付的流程,其他几种很简单,差别不大。

微信支付开发 ( 超详细,建议收藏)

支付流程图

微信支付开发 ( 超详细,建议收藏)

通过官方给出的流程图,我们可以很清楚的看到整个支付的流程。下面就来详细说一下支付的流程,让大家尽可能的理解!

  1. 首先是用户在我们的应用上进行下单请求。
  2. 在我们的后台请求进行处理,下订单、生成订单号
  3. 在我们后台向微信统一下单API
  4. 微信向我们后台返回一个交易连接
  5. 我们后台将交易链接转换成二维码图片(可以用谷歌的zxing),然后将二维码图片返回给用户
  6. 用户使用微信扫一扫进行支付(这一部分就是用户与微信交互了,跟后台没有什么关系)
  7. 用户支付成功后进行异步通知,向我们后台发送支付结果
  8. 后台收到支付结果后,向微信回复接收情况,通知微信我们已经收到了它的消息了

针对未支付、掉单等等,我们可以写一个定时任务。

比如说3分钟去扫一下未支付的订单,调用微信的订单查询API,判断用户是否已经支付,然后进行自己的业务编写。

微信扫码支付就是这么个流程,是不是感觉很简单,并没有想象中那么复杂。

API调用协议规范

微信支付开发 ( 超详细,建议收藏)

微信支付API

微信支付开发 ( 超详细,建议收藏)

这些是微信提供的支付相关的API。

地址:pay.weixin.qq.com/wiki/

统一下单API

微信支付开发 ( 超详细,建议收藏)
微信支付开发 ( 超详细,建议收藏)
微信支付开发 ( 超详细,建议收藏)
微信支付开发 ( 超详细,建议收藏)

这么多请求参数,是不是有点脑壳疼,不用着急,因为微信接口是支持xml格式的。所以,整理一下,就成下面这样啦。

<xml> 	//公众账号id(唯一的),需要去微信支付官方申请,链接在文章底部    <appid>wx2421b1c4370ec43b</appid>        //传入的数据会原样返回,自定义    <attach>支付测试</attach>        //这是对你产品的描述信息     <body>JSAPI支付测试</body>        //微信分配的商户id(唯一的),用于收款的(链接在文章底部)    <mch_id>10000100</mch_id>     	//对你产品的详细介绍    <detail><![CDATA[{ "goods_detail":[ { "goods_id":"iphone6s_16G", "wxpay_goods_id":"1001", "goods_name":"iPhone6s 16G", "quantity":1, "price":528800, "goods_category":"123456", "body":"苹果手机" }, { "goods_id":"iphone6s_32G", "wxpay_goods_id":"1002", "goods_name":"iPhone6s 32G", "quantity":1, "price":608800, "goods_category":"123789", "body":"苹果手机" } ] }]]></detail>        //随机字符串,长度在32位以下(后面会详细讲解它的用途)    <nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str> 	 	//用于接收微信支付结果的接口(必须是外网可以访问到的)    <notify_url>http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php</notify_url>        //在JSAPI支付的方式会用的此参数,其他的支付产品不需要考虑这个参数    <openid>oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid>        //商户订单号,在用一个商户下唯一(32位以内,数字字母,不可以有特殊字符)    <out_trade_no>1415659990</out_trade_no>        //终端的ip地址(可以是ipv4、ipv6)    <spbill_create_ip>14.23.150.211</spbill_create_ip>     	//支付金额,要大于0(还有一个fee_type参数,是支付的货币,默认是CNY,即人民币) 	<total_fee>1</total_fee>     	//交易类型 (JSAPI,Native,App...)    <trade_type>JSAPI</trade_type>        //签名(后面会详细讲解)    <sign>0CB01533B8C1EF103065174F50BCA001</sign> </xml> 

CDATA标签用于说明数据不被XML解析器解析,即原样输出,不被转义。
举个简单的例子,在xml中,<tag> < <tag> 这样就会报错,因为它把 '<'转译成标签的左半部分,
但是如果<tag> <![CDATA[ < ]]> </tag>这样写,就说明 tag标签存储的是 ‘<’

随机字符串(nonce_str参数)

随机字符串后面会参与生成签名,目的是为了保证签名的不可预测性,不懂的话没有关系,接着往下看,你就会明白。

微信的接口明确说明,随机字符串长度不超过32位。

以java为例(有很多种方式可以随机获取字符串,我用了比较简单的方法,为了让大家容易理解)

	//只要长度大于0小于32就可以  	Integer length = 30; 	String chars = "abcdefghijklmnopqrstuvwxyz0123456789"; 	Random random = new Random(); 	StringBuffer sb = new StringBuffer(); 	for (int i = 0; i < length; i++) { 		int number = random.nextInt(chars .length()); 		sb.append(chars .charAt(number)); 	}

签名(sign)

签名生成的通用步骤如下(以下是从微信支付官网复制下来的):

第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

stringA =“appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA”;

特别注意以下重要规则:

◆ 参数名ASCII码从小到大排序(字典序); ◆ 如果参数的值为空不参与签名; ◆ 参数名区分大小写; ◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。 ◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段

第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。

stringSignTemp=stringA+"&key=192006250b4c09247ec02edce69f6a2d"
//注:key为商户平台设置的密钥key
sign=MD5(stringSignTemp).toUpperCase()=“9A0A8659F005D6984697E2CA0A9CF3B7”
//注:MD5签名方式
sign=hash_hmac(“sha256”,stringSignTemp,key).toUpperCase()=“6A9AE1657590FD6257D693A078E1C3E4BB6BA4DC30B23E0EE2496E54170DACD6”
//注:HMAC-SHA256签名方式,部分语言的hmac方法生成结果二进制结果,需要调对应函数转化为十六进制字符串。

◆ key设置路径:微信商户平台(pay.weixin.qq.com)–>账户设置–>API安全–>密钥设置

密钥的作用是什么呢?

密钥是为了在网络传输过程中,确保数据不会被随意篡改,如果数据被篡改,那么最终的得到的密钥和原来的密钥是不同的,所以通过这个方法判断数据是否被篡改。

说白了就是在向微信发送请求之前进行签名,微信接收到数据之后,对数据以同样的方法签名,判断两次的签名是否相同,来分辨数据的安全性。

如果直接把数据传送过去的话,在传输过程中是很容易被篡改的。(使用抓包技术就可以轻松的完成)

这么多参数,难道都要传吗?

可以按照自己的需要进行选择性传参,但是接口文档里要求必填,那就必须要传,否则接口会调用失败。

简单的传参 :公众id、商户号、订单号、金额、货币种类,回调url,随机字符串、签名

返回结果

微信支付开发 ( 超详细,建议收藏)
微信支付开发 ( 超详细,建议收藏)
微信支付开发 ( 超详细,建议收藏)

结束

由于我没有营业执照,所以没有办法给大家演示支付效果。可以去办一个 个体工商户,但是为了学习,不必那么麻烦,可以知道它的流程就可以。

过几天我会用支付宝沙箱环境给大家进行演示支付宝扫码支付功能,记得关注哦。

整理不易,顺手点个赞支持一下吧,不足的地方欢迎指出,我会改进的。

微信公众账号申请地址: mp.weixin.qq.com/

微信商户id申请地址: pay.weixin.qq.com/stati

如果有不对地方请指出,以免误导他人。


作者:小榴莲℡
链接:blog.csdn.net/qq_443978
来源:CSDN

原文始发于:微信支付开发 ( 超详细,建议收藏)


0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注