zoukankan      html  css  js  c++  java
  • JAVA微信支付接口开发——支付

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

    这几天在做支付服务,系统接入了支付宝、微信、银联三方支付接口。个人感觉支付宝的接口开发较为简单,并且易于测试。
    关于数据传输,微信是用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()等等。最后根据接口文档中返回的数据判断进行业务操作。
    最后吐槽一下,微信测试号没有提供支付测试环境,需要真实的服务号。

  • 相关阅读:
    mpvue: stylus定义主题色
    mpvue: 单个页面自定义导航栏或隐藏
    mpvue: fsevents is not a constructor
    Nginx:taro h5 Nginx代理配置
    git: 替换remote origin
    taro3.x: h5地图兼容组件封装
    taro3.x: h5地图兼容
    taro3.x: 使用taro-router在H5浏览器返回报错
    taro3.x: tarojs-router
    java线程与线程安全的单例模式
  • 原文地址:https://www.cnblogs.com/vincent928/p/10084114.html
Copyright © 2011-2022 走看看