本文主要介绍的是JAVA对接支付宝和微信支付,废话少说上代码(部分业务代码就不上了,例如订单等,根据业务需求自行修改):
用到的工具类:
maven依赖:
<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.6.0.ALL</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jdom/jdom -->
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom</artifactId>
<version>2.0.2</version>
</dependency>
PayCommonUtil:
package com.cx.wisdom.utils.pay;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import javax.servlet.http.HttpServletRequest;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import com.cx.wisdom.config.pay.PayConfig;
import com.cx.wisdom.utils.gt.MD5Util;
public class PayCommonUtil
{
public static final String TIME = "yyyyMMddHHmmss";
/**
* 锁对象,可以为任意对象
*/
private static Object lockObj = "lockerOrder";
/**
* 订单号生成计数器
*/
private static long orderNumCount = 0L;
/**
* 每毫秒生成订单号数量最大值
*/
private static int maxPerMSECSize = 1000;
/**
* 生成非重复订单号,理论上限1毫秒1000个,可扩展
*/
public static String makeOrderNum()
{
try
{
// 最终生成的订单号
String finOrderNum = "";
synchronized (lockObj)
{
// 取系统当前时间作为订单号变量前半部分,精确到毫秒
long nowLong = Long.parseLong(
new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()));
// 计数器到最大值归零,可扩展更大,目前1毫秒处理峰值1000个,1秒100万
if (orderNumCount >= maxPerMSECSize)
{
orderNumCount = 0L;
}
// 组装订单号
String countStr = maxPerMSECSize + orderNumCount + "";
finOrderNum = "PAYORDERNO-N" + nowLong + countStr.substring(1);
orderNumCount++ ;
}
return finOrderNum;
}
catch (Exception e)
{
e.printStackTrace();
}
return "";
}
public static String getRemoteHost(HttpServletRequest request)
{
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getRemoteAddr();
}
return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip;
}
// 随机字符串生成
public static String getRandomString(int length)
{ // length表示生成字符串的长度
String base = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++ )
{
int number = random.nextInt(base.length());
sb.append(base.charAt(number));
}
return sb.toString();
}
// 生成签名
public static String createSign(String key, String characterEncoding,
SortedMap<String, Object> parameters)
{
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();
Iterator it = es.iterator();
while (it.hasNext())
{
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
Object v = entry.getValue();
if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k))
{
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + key);
System.out.println(sb.toString());
String sign = MD5Util.getMd5Code(sb.toString()).toUpperCase();
return sign;
}
// 请求xml组装
public static String getRequestXml(SortedMap<String, Object> parameters)
{
StringBuffer sb = new StringBuffer();
sb.append("");
Set es = parameters.entrySet();
Iterator it = es.iterator();
while (it.hasNext())
{
Map.Entry entry = (Map.Entry)it.next();
String key = (String)entry.getKey();
String value = (String)entry.getValue();
if ("attach".equalsIgnoreCase(key) || "body".equalsIgnoreCase(key)
|| "sign".equalsIgnoreCase(key))
{
sb.append("<" + key + ">" + "</" + key + ">");
}
else
{
sb.append("<" + key + ">" + value + "</" + key + ">");
}
}
sb.append("");
return sb.toString();
}
// 请求方法
public static String httpsRequest(String requestUrl, String requestMethod, String outputStr)
{
try
{
URL url = new URL(requestUrl);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
// 设置请求方式(GET/POST)
conn.setRequestMethod(requestMethod);
conn.setRequestProperty("content-type", "appl