Jar包依赖
<!-- AliPay Old -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.12.4.ALL</version>
</dependency>
支付宝API,异步通知:官方文档 说到这一点,支付宝还是比较实在的,调用API整个过程不花一分钱,而且文档详细,人工服务很好联系,这点微信支付应该学习一下
/**
* 支付宝异步通知
* @param request
* @return
* @throws Exception
*/
@PostMapping(value = "aliPayCallBack")
public String aliPayCallBack(HttpServletRequest request) throws Exception {
Map<String, String[]> requestParameterMap = request.getParameterMap();
HashMap<String, Object> map = null;
//异步验签
log.info("[支付_支付宝]开始异步验签");
map = AliPayUtil.asyncSignVerify(requestParameterMap);
String notice = "fail";
//验签成功
if ((boolean) map.get("succ")) {
log.info("[支付_支付宝]验签成功!");
//获取支付状态
LinkedHashMap<String, String> linkedHashMap = (LinkedHashMap<String, String>) map.get("data");
String trade_status = linkedHashMap.get("trade_status");
switch (trade_status) {
//等待买家付款
case "WAIT_BUYER_PAY":
/**todo 业务处理,省略,根据自己需求**/
break;
//未付款交易超时关闭,或支付完成后全额退款。
case "TRADE_CLOSED":
/**todo 业务处理,省略,根据自己需求**/
break;
//交易结束,不可退款。
case "TRADE_FINISHED":
/**todo 业务处理,省略,根据自己需求**/
//更新订单完成时间
break;
//交易支付成功。
case "TRADE_SUCCESS":
/**todo 业务处理,省略,根据自己需求**/
/**
*注意异步通知处理完成后,必须返回给支付宝:success 这几个字符
*或者HttpServletResponse输出,详情看官方文档
*/
notice = "success";
break;
}
} else {
log.info("[支付_支付宝]验签失败!");
}
//默认返回验签失败,支付宝会以一定时间间隔持续通知
return notice;
}
验签方法 AliPayUtil.asyncSignVerify() Jar包依赖,主要是StringUtils这个工具类的
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
/**
* 异步验签
*
* @param requestParameterMap
* @return
* @throws AlipayApiException
*/
public static HashMap<String, Object> asyncSignVerify(Map<String, String[]> requestParameterMap)
throws AlipayApiException {
//编码格式,修改成你自己的
String charset = "utf-8";
//支付宝公钥,修改成你自己的
String alipaypublicKey = "支付宝公钥";
//签名方式,修改成你自己的
String sign_type = "RSA2";
//拼接返回内容
StringBuilder builder = new StringBuilder();
for (Map.Entry<String, String[]> stringEntry : requestParameterMap.entrySet()) {
builder.append(stringEntry.getKey()).append("=").
append(StringUtils.removeEnd(
StringUtils.removeStart(Arrays.toString(
stringEntry.getValue()), "["), "]"))
.append("&");
}
String resultInfo = StringUtils.removeEnd(builder.toString(), "&");
log.info("[支付_支付宝]待验签内容:{}", resultInfo);
//对待签名字符串数据通过&进行拆分
String[] temp = resultInfo.split("&");
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
//把拆分数据放在map集合内
for (int i = 0; i < temp.length; i++) {
String[] arr = temp[i].split("=", 2); //通过"="号分割成2个数据
String[] tempAagin = new String[arr.length]; //再开辟一个数组用来接收分割后的数据
for (int j = 0; j < arr.length; j++) {
tempAagin[j] = arr[j];
}
map.put(tempAagin[0], tempAagin[1]);
}
boolean flg = AlipaySignature.rsaCheckV1(map, alipaypublicKey, charset, sign_type);
HashMap<String, Object> objectHashMap = new HashMap<>();
objectHashMap.put("data", map);
objectHashMap.put("succ", flg);
return objectHashMap;
}