微信支付接口 java服务器,JAVA微信支付接口开发——支付(示例代码)

微信支付接口开发——支付

这几天在做支付服务,系统接入了支付宝、微信、银联三方支付接口。个人感觉支付宝的接口开发较为简单,并且易于测试。

关于数据传输,微信是用xml,所以需要对xml进行解析。

1、微信支付的几种接口

付款码支付、JSAPI支付、Native支付、APP支付、H5支付、小程序支付。几种支付方式都是大同小异。

2、支付流程

基于APP支付来说,微信支付的大体流程:

1、APP客户端根据用户支付请求,将订单信息(订单号,金额等)传至后台服务器

2、后台服务器根据订单信息,拼装微信统一下单接口需要的请求参数。其中比较重要的参数为appid、mch_id、nonce_str、sign、out_trade_no、total_fee、notify_url。

这里参数拼装需要根据微信提供的签名算法

假设请求参数为:

"appid":"wxd930ea5d5a258f4f"

"mch_id":"10000100"

"body":"test"

"nonce_str":"ibuaiVcKdpRxkhJA"

需要将以上参数按照规则先拼装成String

key值按照ASCII从小到大排序(A->Z),key=value形式并用&连接

String a = "appid=wxd930ea5d5a258f4f&mch_id=10000100&body=test&nonce_str=ibuaiVcKdpRxkhJA"

拼接API密钥 key 是商户平台设置的密钥key

signStr = a + "&key=192006250b4c09247ec02edce69f6a2d"

MD5签名(转大写) 注:微信默认为MD5签名,也支持HMAC-SHA256签名方式

sign=MD5(signStr).toUpperCase()

//最终得到sign = "9A0A8659F005D6984697E2CA0A9CF3B7"

然后sign继续按照规则(A->Z)拼装进String中。

java中可以用map完成排序

Map paramsMap = new TreeMap(String::compareTo);

paramsMap.put("appid", APP_APP_ID);

......

//完成签名得到sign

paramsMap.put("sign",sign);

最后需要将参数转化成xml格式的string进行接口请求

![CDATA[wxd930ea5d5a258f4f]]

![CDATA[10000100]]

![CDATA[1000]]

![CDATA[ibuaiVcKdpRxkhJA]]

![CDATA[9A0A8659F005D6984697E2CA0A9CF3B7]]

3、微信支付统一下单的接口地址为:https://api.mch.weixin.qq.com/pay/unifiedorder

java中可以利用httpclient进行post调用。参数即之前拼接完成的带sign签名参数。

得到微信支付接口的返回值也同样是xml格式的数据,需要我们将其转成便于操作的map型数据。

返回的数据包含了return_code、return_msg。

return_code只有SUCCESS和FAIL,这是通信成功与否的标识,非业务标识。

只有return_code是SUCCESS时,才会有其他数据返回包括result_code,sign等。

若result_code业务标识也同样为SUCCESS时候才说明微信方预付单生成成功。

这时会返回我们支付业务需要的prepay_id预支付会话id。

注意: 这里需要我们进行sign签名验证,以保证数据安全性

4、将通过验签的prepay_id等信息返回给APP客户端。此时APP端可以调起支付接口,

调起了微信支付窗口,让用户完成支付操作。

然后微信端会根据之前设置的notify_url异步通知地址,进行调用。通知服务端支付情况。

3、总结

微信支付接口开发还涉及到订单的相关业务(查询,关闭),以及退款等相关业务。

微信支付主要需要先了解其业务流程,然后就是调用微信支付的接口,其中就是参数的拼装与验签。这部分可以抽取成一个工具类,比如mapToXml(),xmlToMap(),md5()等等。最后根据接口文档中返回的数据判断进行业务操作。

最后吐槽一下,微信测试号没有提供支付测试环境,需要真实的服务号。

你可能感兴趣的:(微信支付接口,java服务器)