java app微信支付接口_JAVA微信APP支付接口整合

上次我们看到了支付宝的APP支付工具,那么这次就来封装封装微信的APP支付;如果已经清楚了支付宝的支付流程,那么微信支付也和它大同小异了,当然这其中肯定是有各种变化的:

首先让我把微信支付文档的官网贴出来,下面代码中有不懂得可以查看文档:

好了,关键的文档就这么多;微信的官方支付SDK我没有找到,就只有自己开写啦,当然,也借助了网上不少大牛的技术支持,在这里表示非常非常感谢;

话不多说,我们直接来上代码:

1: 微信APP支付配置文件(数据为测试数据):

package com.xt.shop.web.wxpay;

/**

*

类 说 明: TODO 微信APP支付配置文件

*

创建时间: 2017年11月2日 上午9:02:51

*

创 建 人: geYang

**/

public class WxpayConfig {

/**

* 微信开发平台应用ID

*/

public static final String APPID = "wx5cb4da2827891470";

/**

* 微信支付商户号

*/

public static final String MCH_ID = "1458672702";

/**

* 应用对应的凭证

*/

public static final String APP_SECRET = "68c39252926ac35b091b9f824c1e065e";

/**

* 应用对应的密钥

*/

public static final String APP_KEY = "7PEsu5akPFRDfORYWNWj6QanQhzuXTJ0";

/**

* 商户号对应的密钥

*/

public static final String PARTNER_KEY = "123466";

/**

* 商户id

*/

public static final String PARTNER_ID = "14698sdfs402dsfdew402";

/**

* 常量固定值

*/

public static final String GRANT_TYPE = "client_credential";

/**

* 微信服务器回调通知URL

*/

public static final String NOTIFY_URL = "/wxPayNotify";

/**

* 获取预支付ID的接口URL 统一下单接口地址

*/

public static final String REQUEST_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";

/**

* 关闭订单接口,避免出现(订单重复提交出错)

*/

public static final String CLOSE_ORDER_URL = "https://api.mch.weixin.qq.com/pay/closeorder";

/**

* 查看订单接口

*/

public static final String ORDER_QUERY_URL = "https://api.mch.weixin.qq.com/pay/orderquery";

}

2: MD5加密工具

package com.xt.shop.web.wxpay;

import java.security.MessageDigest;

/**

*

类 说 明: TODO MD5加密工具类

*

创建时间: 2017年11月7日 上午10:34:26

*

创 建 人: geYang

**/

public class MD5Util {

/**

*

方法说明: TODO MD5加密 编码:UTF-8

*

创建时间: 2017年11月2日 下午4:00:17

*

创 建 人: geYang

**/

public static String md5Encode(String paramStr) {

String encodeStr = null;

try {

encodeStr = new String(paramStr);

MessageDigest md = MessageDigest.getInstance("MD5");

encodeStr = byteArrayToHexString(md.digest(encodeStr.getBytes("UTF-8")));

} catch (Exception exception) {

}

return encodeStr;

}

private static String byteArrayToHexString(byte b[]) {

StringBuffer resultSb = new StringBuffer();

for (int i = 0; i < b.length; i++){

resultSb.append(byteToHexString(b[i]));

}

return resultSb.toString();

}

private static String byteToHexString(byte b) {

int n = b;

if (n < 0){

n += 256;

}

int d1 = n / 16;

int d2 = n % 16;

return HEX_DIGITS[d1] + HEX_DIGITS[d2];

}

private static final String[] HEX_DIGITS = { "0", "1", "2", "3", "4", "5",

"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };

}

3: XML解析工具

package com.xt.shop.web.wxpay;

import java.io.ByteArrayInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import org.jdom2.Document;

import org.jdom2.Element;

import org.jdom2.JDOMException;

import org.jdom2.input.SAXBuilder;

import com.xt.shop.until.IsNull;

/**

*

类 说 明: TODO XML解析工具

*

创建时间: 2017年11月7日 上午10:36:15

*

创 建 人: geYang

**/

public class XMLUtil {

/**

*

方法说明: TODO 解析XML,返回第一级元素键值对;如果第一级元素有子节点,则此节点的值是子节点的XML数据;

*

参数说明: String xmlStr XML格式字符串

*

参数说明: @throws JDOMException

*

参数说明: @throws IOException

*

返回说明: Map xmlMap 解析后的数据

*

创建时间: 2017年11月2日 上午10:04:39

*

创 建 人: geYang

**/

public static Map doXMLParse(String xmlStr) throws JDOMException, IOException {

xmlStr = xmlStr.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");

if (IsNull.isNull(xmlStr)) {

return null;

}

Map xmlMap = new HashMap<>();

InputStream in = new ByteArrayInputStream(xmlStr.getBytes("UTF-8"));

SAXBuilder builder = new SAXBuilder();

Document doc = builder.build(in);

Element root = doc.getRootElement();

List list = root.getChildren();

Iterator it = list.iterator();

while (it.hasNext()) {

Element e = (Element) it.next();

String k = e.getName();

String v = "";

List children = e.getChildren();

if (children.isEmpty()) {

v = e.getTextNormalize();

} else {

v = XMLUtil.getXMLStr(children);

}

xmlMap.put(k, v);

}

in.close(); // 关闭流

return xmlMap;

}

/**

*

方法说明: TODO 获取子结点的XML,生成XML格式字符串

*

参数说明: List listElement

*

返回说明: XML格式字符串

*

创建时间: 2017年11月2日 上午9:58:59

*

创 建 人: geYang

**/

private static String getXMLStr(List listElement) {

StringBuffer xmlStr = new StringBuffer();

if (!listElement.isEmpty()) {

Iterator it = listElement.iterator();

while (it.hasNext()) {

Element e = it.next();

String name = e.getName();

String value = e.getTextNormalize();

List listChildren = e.getChildren();

xmlStr.append("");

if (!listChildren.isEmpty()) {

xmlStr.append(XMLUtil.getXMLStr(listChildren)); // 递归

}

xmlStr.append(value);

xmlStr.append("" + name + ">");

}

}

return xmlStr.toString();

}

/**

*

方法说明: TODO 获取XML编码字符集

*

参数说明: String xmlStr

*

参数说明: @return

*

参数说明: @throws JDOMException

*

参数说明: @throws IOException

*

返回说明:

*

创建时间: 2017年11月2日 上午10:31:16

*

创 建 人: geYang

**/

public static String getXMLEncoding(String xmlStr) throws JDOMException, IOException {

InputStream in = new ByteArrayInputStream(xmlStr.getBytes());

SAXBuilder builder = new SAXBuilder();

Document document = builder.build(in);

in.close();

return (String)document.getProperty("encoding");

}

/**

*

方法说明: TODO 支付成功(失败)后返回给微信的参数

*

参数说明: String return_code

*

参数说明: String return_msg

*

返回说明:

*

创建时间: 2017年11月2日 上午10:42:10

*

创 建 人: geYang

**/

public static String setXML(String returnCode, String returnMsg) {

return "

+ "]]>

+ "]]>

";

}

public static void main(String[] args) {

StringBuffer xmlStr = new StringBuffer();

xmlStr.append("");

xmlStr.append("wx2421b1c4370ec43b");

xmlStr.append("支付测试");

xmlStr.append("

APP支付测试");

xmlStr.append("10000100");

xmlStr.append("1add1a30ac87aa2db72f57a2375d8fec");

xmlStr.append("http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php");

xmlStr.append("1415659990");

xmlStr.append("14.23.150.211");

xmlStr.append("1");

xmlStr.append("APP");

xmlStr.append("0CB01533B8C1EF103065174F50BCA001");

xmlStr.append("");

System.out.println("解析前=="+xmlStr);

Map doXMLParse = new HashMap<>();

try {

doXMLParse = XMLUtil.doXMLParse(xmlStr.toString());

} catch (JDOMException | IOException e) {

e.printStackTrace();

System.out.println("解析Map失败");

}

System.out.println("解析后=="+doXMLParse);

}

}

4: 微信支付工具

package com.xt.shop.web.wxpay;

import java.net.Inet4Address;

import java.net.InetAddress;

import java.net.InterfaceAddress;

import java.net.NetworkInterface;

import java.net.SocketException;

import java.text.DecimalFormat;

import java.util.Enumeration;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Random;

import java.util.Set;

import java.util.SortedMap;

import java.util.TreeMap;

import javax.servlet.http.HttpServletRequest;

import com.xt.shop.until.IsNull;

import com.xt.shop.until.http.HttpUtil;

/**

*

类 说 明: TODO 微信支付工具

*

创建时间: 2017年11月7日 上午10:37:46

*

创 建 人: geYang

**/

public class WxpayUtil {

private static final String STR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

/**

*

方法说明: TODO 获取微信回调地址

*

创建时间: 2017年11月2日 下午1:21:05

*

创 建 人: geYang

**/

public static String getNotifyUrl(HttpServletRequest request){

StringBuffer requestURL = request.getRequestURL();

return requestURL.substring(0,requestURL.indexOf("/front/"))+WxpayConfig.NOTIFY_URL;

}

/**

*

方法说明: TODO 统一下单 参数处理

*

参数说明: String orderNo 订单号

*

参数说明: String totalAmount 订单总金额

*

参数说明: String notifyUrl 回调通知地址

*

参数说明: String body 订单描述

*

返回说明:

*

创建时间: 2017年11月3日 上午9:56:23

*

创 建 人: geYang

**/

public static String getUnifiedOrder(String orderNo,String totalAmount,String notifyUrl,String body){

SortedMap paramMap = new TreeMap();

paramMap.put("appid", WxpayConfig.APPID); //应用ID

paramMap.put("mch_id", WxpayConfig.MCH_ID); //商户号

paramMap.put("nonce_str", getNonceStr(null)); //随机字符串

paramMap.put("body", body); //商品描述

paramMap.put("out_trade_no", orderNo); //商户订单号

paramMap.put("total_fee", getTotalFee(totalAmount));//支付总金额

paramMap.put("spbill_create_ip",getLocalhostIP()); //当前本机IP: 192.168.102.10

paramMap.put("notify_url", notifyUrl); //回调通知地址

paramMap.put("trade_type", "APP"); //支付类型

paramMap.put("sign", rsaSign(paramMap)); //数据签名

return getRequestXML(paramMap); //请求参数

}

/**

*

方法说明: TODO 返回APP 参数处理

*

参数说明: String prepayId 预支付交易会话ID

*

返回说明:

*

创建时间: 2017年11月3日 上午10:00:30

*

创 建 人: geYang

**/

public static String getReturnParam(String prepayId){

String timestamp = (System.currentTimeMillis()+"").substring(0, 10);

SortedMap returnMap = new TreeMap();

returnMap.put("appid", WxpayConfig.APPID); //应用ID

returnMap.put("partnerid", WxpayConfig.MCH_ID); //商户号

returnMap.put("prepayid", prepayId); //预支付交易会话ID

returnMap.put("package", "Sign=WXPay"); //扩展字段 固定值 Sign=WXPay

returnMap.put("noncestr", getNonceStr(null)); //随机字符串

returnMap.put("timestamp", timestamp); //时间戳

returnMap.put("sign", rsaSign(returnMap)); //签名

return getRequestXML(returnMap); //请求参数

}

/**

*

方法说明: TODO 关闭/查看 订单 参数处理

*

参数说明: String orderNo 商户订单号

*

创建时间: 2017年11月3日 下午2:55:53

*

创 建 人: geYang

**/

public static String closeORqueryOrderParam(String orderNo) {

SortedMap returnMap = new TreeMap();

returnMap.put("appid", WxpayConfig.APPID); //应用ID

returnMap.put("mch_id", WxpayConfig.MCH_ID); //商户号

returnMap.put("out_trade_no", orderNo); //商户订单号

returnMap.put("nonce_str", getNonceStr(null)); //随机字符串

returnMap.put("sign", rsaSign(returnMap)); //签名

return getRequestXML(returnMap); //请求参数

}

/**

*

方法说明: TODO 验证签名

*

参数说明: Map paramMap

*

返回说明: boolean

*

创建时间: 2017年11月3日 上午11:18:47

*

创 建 人: geYang

**/

public static boolean rsaCheck(Map paramMap){

System.out.println("↓↓↓↓↓↓↓↓↓↓微信支付签名验证处理↓↓↓↓↓↓↓↓↓↓");

SortedMap paramSorMap = new TreeMap();

paramSorMap.putAll(paramMap);

boolean rsaCheck = paramMap.get("sign").equals(rsaSign(paramSorMap));

System.out.println("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");

return rsaCheck;

}

/**

*

方法说明: TODO sign签名

*

参数说明: SortedMap paramMap

*

返回说明: String

*

创建时间: 2017年11月2日 下午3:45:02

*

创 建 人: geYang

**/

private static String rsaSign(SortedMap paramMap){

StringBuffer paramStr = new StringBuffer();

Set> paramSet = paramMap.entrySet();

Iterator> it = paramSet.iterator();

while(it.hasNext()) {

Entry entry = it.next();

String k = entry.getKey();

String v = entry.getValue();

if(!IsNull.isNull(v) && !"sign".equals(k) && !"key".equals(k)) {

paramStr.append(k + "=" + v + "&");

}

}

paramStr.append("key="+ WxpayConfig.APP_KEY); //注:key为商户平台设置的密钥key

String sign = MD5Util.md5Encode(paramStr.toString()).toUpperCase();//注:MD5签名方式

System.out.println("微信签名参数=="+paramStr.toString());

System.out.println("微信签 名 值=="+sign);

return sign;

}

/**

*

方法说明: TODO 生成随机字符串

*

参数说明: Integer length 默认16

*

返回说明: 长度为 length 的字符串

*

创建时间: 2017年11月2日 下午2:57:57

*

创 建 人: geYang

**/

private static String getNonceStr(Integer length) {

length = IsNull.isNull(length) ? 16 : length;

StringBuffer nonceStr = new StringBuffer();

for (int i = 0; i < length; i++) {

Random rd = new Random();

nonceStr.append(STR.charAt(rd.nextInt(STR.length() - 1)));

}

return nonceStr.toString();

}

/**

*

方法说明: TODO 获取本机IP

*

返回说明: 通过 获取系统所有的networkInterface网络接口 然后遍历 每个网络下的InterfaceAddress组,

* 获得符合 "InetAddress instanceof Inet4Address" 条件的一个IpV4地址

*

创建时间: 2017年11月2日 下午2:02:20

*

创 建 人: geYang

**/

private static String getLocalhostIP(){

String ip = null;

Enumeration> allNetInterfaces;

try {

allNetInterfaces = NetworkInterface.getNetworkInterfaces();

while (allNetInterfaces.hasMoreElements()) {

NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement();

List interfaceAddress = netInterface.getInterfaceAddresses();

for (InterfaceAddress add : interfaceAddress) {

InetAddress inetAddress = add.getAddress();

if (inetAddress != null && inetAddress instanceof Inet4Address) {

ip = inetAddress.getHostAddress();

}

}

}

} catch (SocketException e) {

e.printStackTrace();

System.out.println("获取IP异常");

}

return ip;

}

/**

*

方法说明: TODO 将请求参数转换为XML格式的String

*

参数说明: SortedMap paramMap

*

返回说明: String

*

创建时间: 2017年11月2日 下午4:16:21

*

创 建 人: geYang

**/

private static String getRequestXML(SortedMap paramMap){

StringBuffer requestXML = new StringBuffer();

requestXML.append("");

Set> paramSet = paramMap.entrySet();

Iterator> it = paramSet.iterator();

while(it.hasNext()) {

Entry entry = it.next();

String k = entry.getKey();

String v = entry.getValue();

requestXML.append(""+v+""+k+">");

}

requestXML.append("");

System.out.println("微信请求参数=="+requestXML);

return requestXML.toString();

}

/**

*

方法说明: TODO 获取整数格式支付总金额

*

参数说明: String totalAmount 保留两位小数的金额

*

返回说明: String getTotalFee 整数的金额

*

创建时间: 2017年11月2日 下午5:39:03

*

创 建 人: geYang

**/

private static String getTotalFee(String totalAmount){

DecimalFormat decimalFormat = new DecimalFormat("###################.###########");

return decimalFormat.format(Double.valueOf(totalAmount)*100);

}

/**

*

方法说明: TODO 订单查看处理

*

创建时间: 2017年11月3日 下午3:34:16

*

创 建 人: geYang

**/

public static Map orderQuery(String orderNo) throws Exception{

System.out.println("↓↓↓↓↓↓↓↓↓↓微信支付订单查看处理↓↓↓↓↓↓↓↓↓↓");

String receiveParam = HttpUtil.doPostToStrUTF8(WxpayConfig.ORDER_QUERY_URL, closeORqueryOrderParam(orderNo));

return XMLUtil.doXMLParse(receiveParam);

}

/**

*

方法说明: TODO 订单关闭处理

*

创建时间: 2017年11月3日 下午3:34:16

*

创 建 人: geYang

**/

public static Map colseOrder(String orderNo) throws Exception{

System.out.println("↓↓↓↓↓↓↓↓↓↓微信支付订单关闭处理↓↓↓↓↓↓↓↓↓↓");

String receiveParam = HttpUtil.doPostToStrUTF8(WxpayConfig.CLOSE_ORDER_URL, closeORqueryOrderParam(orderNo));

return XMLUtil.doXMLParse(receiveParam);

}

public static void main(String[] args) throws Exception {

String orderNo = "R20171027114996454";

System.out.println(orderQuery(orderNo));

// System.out.println(colseOrder(orderNo));

}

}

5: 微信支付请求:

package com.xt.shop.web.wxpay;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.util.HashMap;

import java.util.Map;

import javax.annotation.Resource;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RestController;

import com.xt.shop.base.exception.MyException;

import com.xt.shop.base.service.inter.ProductOrderInter;

import com.xt.shop.base.service.inter.RepairOrderInter;

import com.xt.shop.until.IsNull;

import com.xt.shop.until.http.HttpUtil;

import com.xt.shop.until.often.MyResult;

/**

*

类 说 明: TODO 微信支付处理

*

创建时间: 2017年11月2日 下午1:26:08

*

创 建 人: geYang

**/

@RestController

public class WxpayController {

/**

* 商品订单

*/

@Resource

private ProductOrderInter productOrderInter;

/**

* 维修订单

*/

@Resource

private RepairOrderInter repairOrderInter;

/**

*

方法说明: TODO 支付回调处理

*

创建时间: 2017年11月3日 上午10:58:46

*

创 建 人: geYang

**/

@RequestMapping(value="/wxPayNotify")

String getPayNotify(HttpServletRequest request){

System.out.println("↓↓↓↓↓↓↓↓↓↓微信支付回调业务处理↓↓↓↓↓↓↓↓↓↓");

Map receiveMap = new HashMap<>();

try { //读取参数

receiveMap = XMLUtil.doXMLParse(receiveParam(request));

} catch (Exception e) {

e.printStackTrace();

System.out.println("微信支付回调数据流错误");

}

System.out.println("微信支付回调参数=="+receiveMap);

if(!WxpayUtil.rsaCheck(receiveMap)){ //签名验证

System.out.println("微信支付回调签名验证失败");

return XMLUtil.setXML("FAIL", "签名验证失败");

}

if(receiveMap.get("return_code").equals("SUCCESS")){ //返回成功

if(receiveMap.get("result_code").equals("SUCCESS")){ //业务返回成功

String orderNo = receiveMap.get("out_trade_no");

System.out.println("微信支付回调商户订单号=="+orderNo);

//订单业务操作

if(orderNo.startsWith("G")){ //商品订单

try {

return productOrderInter.paymentProductOrder(orderNo, 1);

} catch (MyException e) {

e.printStackTrace();

System.out.println(e.getMessage());

return "failure";

}

} else if(orderNo.startsWith("R")){ //维修订单

try {

return repairOrderInter.paymentRepairOrder(orderNo, 1);

} catch (MyException e) {

e.printStackTrace();

System.out.println(e.getMessage());

return "failure";

}

}

return XMLUtil.setXML("SUCCESS", "OK");

}

System.out.println("微信支付回调业务错误:"+receiveMap.get("err_code_des"));

return XMLUtil.setXML("FAIL", receiveMap.get("err_code_des"));

}

System.out.println("微信支付回调返回错误:"+receiveMap.get("return_msg"));

return XMLUtil.setXML("FAIL", receiveMap.get("return_msg"));

}

/**

*

方法说明: TODO 获取数据流数据

*

创建时间: 2017年11月3日 下午1:57:15

*

创 建 人: geYang

**/

private static String receiveParam (HttpServletRequest request) throws IOException{

StringBuffer receiveParam = new StringBuffer();

InputStream inputStream = request.getInputStream();

InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");

BufferedReader in = new BufferedReader(inputStreamReader);

while ( in.readLine() != null){

receiveParam.append(in.readLine());

}

in.close();

inputStream.close();

System.out.println("微信支付回调参数=="+receiveParam);

return receiveParam.toString();

}

/**

*

方法说明: TODO 微信支付统一下单接口

*

参数说明: String orderNo 订单号

*

返回说明:

*

创建时间: 2017年11月2日 下午1:29:00

*

创 建 人: geYang

**/

@RequestMapping(value="/front/wxPay",method=RequestMethod.POST)

Object wxPay(String orderNo,HttpServletRequest request) {

if(IsNull.isNull(orderNo)){

return MyResult.errMap("请指定订单号");

}

StringBuffer totalAmount = new StringBuffer(); //订单总价值

StringBuffer body = new StringBuffer(); //对一笔交易的具体描述信息

//订单业务操作

if(orderNo.startsWith("G")){ //商品订单

Map order;

try {

order = productOrderInter.isPayment(orderNo);

totalAmount.append(order.get("totalAmount"));

body.append(order.get("productName"));

} catch (MyException e) {

e.printStackTrace();

return MyResult.errMap(e.getMessage());

}

} else if(orderNo.startsWith("R")){ //维修订单

Map order;

try {

order = repairOrderInter.isPayment(orderNo);

totalAmount.append(order.get("totalAmount"));

body.append(order.get("repairItem"));

} catch (MyException e) {

e.printStackTrace();

return MyResult.errMap(e.getMessage());

}

} else {

return MyResult.errMap("订单号错误");

}

String notifyUrl = WxpayUtil.getNotifyUrl(request); //回调地址

return payment(notifyUrl,orderNo,totalAmount.toString(),body.toString());

}

/**

*

方法说明: TODO 统一下单支付处理

*

参数说明: String notifyUrl 回调地址

*

参数说明: String orderNo 订单号

*

参数说明: String totalAmount 订单总金额

*

参数说明: String body 商品描述

*

返回说明: Map

*

创建时间: 2017年11月3日 上午10:47:09

*

创 建 人: geYang

**/

private static Map payment(String notifyUrl,String orderNo,String totalAmount,String body){

System.out.println("↓↓↓↓↓↓↓↓↓↓微信支付统一下单参数处理↓↓↓↓↓↓↓↓↓↓");

String unifiedOrderParam = WxpayUtil.getUnifiedOrder(orderNo,totalAmount,notifyUrl, body);

Map receiveMap = new HashMap<>(); //回调参数

try {

String xmlStr = HttpUtil.doPostToStrUTF8(WxpayConfig.REQUEST_URL, unifiedOrderParam);

receiveMap = XMLUtil.doXMLParse(xmlStr);

System.out.println("微信返回值=="+receiveMap);

} catch (Exception e) {

e.printStackTrace();

System.out.println("微信支付HTTP请求错误");

return MyResult.errMap("微信支付HTTP请求错误");

}

if(receiveMap.get("return_code").equals("SUCCESS")){ //请求返回正常:

if(receiveMap.get("result_code").equals("SUCCESS")){ //业务正常:

System.out.println("↓↓↓↓↓↓↓↓↓↓微信支付返回APP参数处理↓↓↓↓↓↓↓↓↓↓");

Map data = new HashMap<>();

data.put("data", WxpayUtil.getReturnParam(receiveMap.get("prepay_id")));

return MyResult.succMap(data);

}

System.out.println("微信支付请求业务错误:"+receiveMap.get("err_code_des"));

return MyResult.errMap("微信支付请求业务错误:"+receiveMap.get("err_code_des"));

}

System.out.println("微信支付请求返回错误:"+receiveMap.get("return_msg"));

return MyResult.errMap("微信支付请求返回错误:"+receiveMap.get("return_msg"));

}

}

微信APP支付就是这样;其中 WxpayController 类中 payment 方法 使用的 HTTP请求工具在我的第一个博客中:    https://my.oschina.net/u/3681868/blog/1535818

好了,微信的APP支付就这样结束了,各位朋友可以直接进行使用(只需要修改自己的配置文件就好了);有不懂的朋友可以留言讨论,也可以和支付文档对照查看;

其中如果有错误,BUG还请各位大牛指正;真诚感谢......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值