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

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

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

1、微信支付的几种接口

微信支付开发文档

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


2、支付流程

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

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

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

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

假设请求参数为:

"appid":"wxd930ea5d5a258f4f"
"mch_id":"10000100"
"body":"test"
"nonce_str":"ibuaiVcKdpRxkhJA"

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

  1. key值按照ASCII从小到大排序(A->Z),key=value形式并用&连接
String a = "appid=wxd930ea5d5a258f4f&mch_id=10000100&body=test&nonce_str=ibuaiVcKdpRxkhJA"
  1. 拼接API密钥 key 是商户平台设置的密钥key
signStr = a + "&key=192006250b4c09247ec02edce69f6a2d"
  1. 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_codereturn_msg

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

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

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

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

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

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

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

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

5、异步通知接口调用

3、总结

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

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

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

JAVA微信支付接口开发——支付的更多相关文章

  1. Java微信分享接口开发

    发布时间:2018-11-07   技术:springboot+maven   概述 微信JS-SDK实现自定义分享功能,分享给朋友,分享到朋友圈 详细 代码下载:http://www.demodas ...

  2. php微信支付接口开发程序

    php微信支付接口开发程序讲解 微信支付接口现在也慢慢的像支付宝一个可以利用api接口来实现第三方网站或应用进行支付了, 下文整理了一个php微信支付接口开发程序并且己测试,有兴趣的朋友可进入参考. ...

  3. php微信支付接口开发程序(流程已通)

    php微信支付接口开发程序(流程已通) 来源:未知    时间:2014-12-11 17:11   阅读数:11843   作者:xxadmin [导读] 微信支付接口现在也慢慢的像支付宝一个可以利 ...

  4. 支付宝WAP支付接口开发(Node/Coffee语言)

    此博客不更新很久了, 更新的文档在这, 有兴趣到这里围观: http://neutra.github.io/2013/%E6%94%AF%E4%BB%98%E5%AE%9DWAP%E6%94%AF%E ...

  5. php支付宝在线支付接口开发教程【转】

    php支付宝在线支付接口开发教程 这篇文章主要为大家详细介绍了php支付宝在线支付接口开发教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下   1.什么是第三方支付 所谓第三方支付,就是一些和各 ...

  6. 支付宝WAP支付接口开发

    支付宝WAP支付接口开发 因项目需要,要增加支付宝手机网站支付功能,找了支付宝的样例代码和接口说明,折腾两天搞定,谨以此文作为这两天摸索的总结.由于公司有自己的支付接口,并不直接使用这个接口,所以晚些 ...

  7. 【转】支付宝WAP支付接口开发

    支付宝WAP支付接口开发 因项目需要,要增加支付宝手机网站支付功能,找了支付宝的样例代码和接口说明,折腾两天搞定,谨以此文作为这两天摸索的总结.由于公司有自己的支付接口,并不直接使用这个接口,所以晚些 ...

  8. Java微信公众平台开发_02_启用服务器配置

    源码将在晚上上传到 github 一.准备阶段 需要准备事项: 1.一个能在公网上访问的项目: 见:[  Java微信公众平台开发_01_本地服务器映射外网  ] 2.一个微信公众平台账号: 去注册: ...

  9. Java微信公众平台开发_07_JSSDK图片上传

    一.本节要点 1.获取jsapi_ticket //2.获取getJsapiTicket的接口地址,有效期为7200秒 private static final String GET_JSAPITIC ...

随机推荐

  1. Java Fileupload

    fileupload FileUpload 是 Apache commons下面的一个子项目,用来实现Java环境下面的文件上传功能,与常见的SmartUpload齐名. 组件 1.FileUpLoa ...

  2. 在C++中,setw(int n)

    setw(int n)用来控制输出间隔例如:cout<<'s'<<setw(8)<<'a'<<endl;则在屏幕显示s        a //s与a之间 ...

  3. oracle11G 用户密码180天修改概要文件过程

    oracle11G 用户密码180天修改概要文件过程 原因 创建用户的时候不指定概要文件的默认的概要文件是default, 而默认的概要文件中的设置如下,注意斜体部分 PROFILE RESOURCE ...

  4. 1.2 Why need pluggable?

    When Android programmers write new features, bugs, or even crashes will exits in their App. Once a t ...

  5. [Swift]LeetCode497. 非重叠矩形中的随机点 | Random Point in Non-overlapping Rectangles

    Given a list of non-overlapping axis-aligned rectangles rects, write a function pick which randomly ...

  6. [Swift]LeetCode972.相等的有理数 | Equal Rational Numbers

    Given two strings S and T, each of which represents a non-negative rational number, return True if a ...

  7. Python---第3方库

    使用pip命令安装 pip  -h  查看pip使用帮助 pip install  <第3方库名> pip install -U <第3方库名>  对已安装的第三方库更新 pi ...

  8. C#基础语法

    究极入门之Hello world static void Main(string[] args) { //你好,世界 Console.WriteLine("HELLO WORLD" ...

  9. JVM基础系列第6讲:Java 虚拟机内存结构

    看到这里,我相信大家对于一个 Java 源文件是如何变成字节码文件,以及字节码文件的含义已经非常清楚了.那么接下来就是让 Java 虚拟机运行字节码文件,从而得出我们最终想要的结果了.在这个过程中,J ...

  10. JVM基础系列开篇:为什么要学虚拟机?

    跟许多人一样,我一开始接触 Java 虚拟机只是因为面试需要用到,所以硬着头皮看看.所以很多人对于为什么要学虚拟机这个问题,他们的答案都是:因为面试.但我经过了几年的学习和实战,我发现其实学习虚拟机并 ...