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<String, String> paramsMap = new TreeMap<String, String>(String::compareTo);
paramsMap.put("appid", APP_APP_ID);
......
//完成签名得到sign
paramsMap.put("sign",sign);
最后需要将参数转化成xml格式的string进行接口请求
<xml>
<appid>![CDATA[wxd930ea5d5a258f4f]]</appid>
<mch_id>![CDATA[10000100]]</mch_id>
<device_info>![CDATA[1000]]</device_info>
<body>![CDATA[test]]</body>
<nonce_str>![CDATA[ibuaiVcKdpRxkhJA]]</nonce_str>
<sign>![CDATA[9A0A8659F005D6984697E2CA0A9CF3B7]]</sign>
</xml>
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
异步通知地址,进行调用。通知服务端支付情况。
5、异步通知接口调用
3、总结
微信支付接口开发还涉及到订单的相关业务(查询,关闭),以及退款等相关业务。
微信支付主要需要先了解其业务流程,然后就是调用微信支付的接口,其中就是参数的拼装与验签。这部分可以抽取成一个工具类,比如mapToXml(),xmlToMap(),md5()等等。最后根据接口文档中返回的数据判断进行业务操作。
最后吐槽一下,微信测试号没有提供支付测试环境,需要真实的服务号。
JAVA微信支付接口开发——支付的更多相关文章
- Java微信分享接口开发
发布时间:2018-11-07 技术:springboot+maven 概述 微信JS-SDK实现自定义分享功能,分享给朋友,分享到朋友圈 详细 代码下载:http://www.demodas ...
- php微信支付接口开发程序
php微信支付接口开发程序讲解 微信支付接口现在也慢慢的像支付宝一个可以利用api接口来实现第三方网站或应用进行支付了, 下文整理了一个php微信支付接口开发程序并且己测试,有兴趣的朋友可进入参考. ...
- php微信支付接口开发程序(流程已通)
php微信支付接口开发程序(流程已通) 来源:未知 时间:2014-12-11 17:11 阅读数:11843 作者:xxadmin [导读] 微信支付接口现在也慢慢的像支付宝一个可以利 ...
- 支付宝WAP支付接口开发(Node/Coffee语言)
此博客不更新很久了, 更新的文档在这, 有兴趣到这里围观: http://neutra.github.io/2013/%E6%94%AF%E4%BB%98%E5%AE%9DWAP%E6%94%AF%E ...
- php支付宝在线支付接口开发教程【转】
php支付宝在线支付接口开发教程 这篇文章主要为大家详细介绍了php支付宝在线支付接口开发教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.什么是第三方支付 所谓第三方支付,就是一些和各 ...
- 支付宝WAP支付接口开发
支付宝WAP支付接口开发 因项目需要,要增加支付宝手机网站支付功能,找了支付宝的样例代码和接口说明,折腾两天搞定,谨以此文作为这两天摸索的总结.由于公司有自己的支付接口,并不直接使用这个接口,所以晚些 ...
- 【转】支付宝WAP支付接口开发
支付宝WAP支付接口开发 因项目需要,要增加支付宝手机网站支付功能,找了支付宝的样例代码和接口说明,折腾两天搞定,谨以此文作为这两天摸索的总结.由于公司有自己的支付接口,并不直接使用这个接口,所以晚些 ...
- Java微信公众平台开发_02_启用服务器配置
源码将在晚上上传到 github 一.准备阶段 需要准备事项: 1.一个能在公网上访问的项目: 见:[ Java微信公众平台开发_01_本地服务器映射外网 ] 2.一个微信公众平台账号: 去注册: ...
- Java微信公众平台开发_07_JSSDK图片上传
一.本节要点 1.获取jsapi_ticket //2.获取getJsapiTicket的接口地址,有效期为7200秒 private static final String GET_JSAPITIC ...
随机推荐
- Java Fileupload
fileupload FileUpload 是 Apache commons下面的一个子项目,用来实现Java环境下面的文件上传功能,与常见的SmartUpload齐名. 组件 1.FileUpLoa ...
- 在C++中,setw(int n)
setw(int n)用来控制输出间隔例如:cout<<'s'<<setw(8)<<'a'<<endl;则在屏幕显示s a //s与a之间 ...
- oracle11G 用户密码180天修改概要文件过程
oracle11G 用户密码180天修改概要文件过程 原因 创建用户的时候不指定概要文件的默认的概要文件是default, 而默认的概要文件中的设置如下,注意斜体部分 PROFILE RESOURCE ...
- 1.2 Why need pluggable?
When Android programmers write new features, bugs, or even crashes will exits in their App. Once a t ...
- [Swift]LeetCode497. 非重叠矩形中的随机点 | Random Point in Non-overlapping Rectangles
Given a list of non-overlapping axis-aligned rectangles rects, write a function pick which randomly ...
- [Swift]LeetCode972.相等的有理数 | Equal Rational Numbers
Given two strings S and T, each of which represents a non-negative rational number, return True if a ...
- Python---第3方库
使用pip命令安装 pip -h 查看pip使用帮助 pip install <第3方库名> pip install -U <第3方库名> 对已安装的第三方库更新 pi ...
- C#基础语法
究极入门之Hello world static void Main(string[] args) { //你好,世界 Console.WriteLine("HELLO WORLD" ...
- JVM基础系列第6讲:Java 虚拟机内存结构
看到这里,我相信大家对于一个 Java 源文件是如何变成字节码文件,以及字节码文件的含义已经非常清楚了.那么接下来就是让 Java 虚拟机运行字节码文件,从而得出我们最终想要的结果了.在这个过程中,J ...
- JVM基础系列开篇:为什么要学虚拟机?
跟许多人一样,我一开始接触 Java 虚拟机只是因为面试需要用到,所以硬着头皮看看.所以很多人对于为什么要学虚拟机这个问题,他们的答案都是:因为面试.但我经过了几年的学习和实战,我发现其实学习虚拟机并 ...