上次我们看到了支付宝的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还请各位大牛指正;真诚感谢......