公司产品需要做支付功能,集成了支付宝支付和微信支付,现在讲一下支付宝支付。
这是支付宝支付的总流程,我是做java后端的,因此只需要做两件事,提供支付宝签名和处理异步通知结果。
支付宝签名:
添加依赖
<!--支付宝支付所用压缩包-->
<dependency>
<groupId>com.alipay</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>1.0</version>
</dependency>
/**
*生成支付宝签名
*/
public String buildPaySign(double amount, String enterpriseId) throws Exception {
String orderId = UUIDHelper.getOrderNo();//生成订单id
Date current = new Date();
Map<String, String> map = buildPayMap(amount, orderId, current);//创建支付参数信息
String paramsStr = MapConmon.mapSort(map);//支付参数信息根据key排序拼接成字符串
String sign = sign(paramsStr);//加签获取sign
String encodedSign = "";
try {
encodedSign = URLEncoder.encode(sign, CHARSET);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
paramsStr = buildParam(map);//支付参数信息
orderDao.insertOrder(orderId, amount, enterpriseId, current);//插入订单
return paramsStr + "sign=" + encodedSign;//返回签名
}
/**
*构建支付信息
*/
private Map<String, String> buildPayMap(double amount, String orderId, Date date) throws Exception {
Map<String, String> keyValues = new HashMap<String, String>();
keyValues.put("app_id", APPID2);
keyValues.put("biz_content", "{\"timeout_express\":\"90m\",\"product_code\":\"QUICK_MSECURITY_PAY\"," +
"\"total_amount\":\"" + amount + "\",\"subject\":\"充值\",\"body\":\"充值\",\"out_trade_no\":\"" + orderId +
"\"}");
keyValues.put("charset", "utf-8");
keyValues.put("method", "alipay.trade.app.pay");
keyValues.put("sign_type", "RSA2");
keyValues.put("timestamp", TypeConvert.DateToString(date));
keyValues.put("version", "1.0");
keyValues.put("notify_url", NOTIFY_URL);
return keyValues;
}
/**
*排序后拼接
*/
public String mapSort( Map<String, String> map){
List<String> keys = new ArrayList<String>(map.keySet());
// key排序
Collections.sort(keys);
StringBuilder params = new StringBuilder();
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
if(!key.equals("sign")) {
String value = map.get(key);
params.append(buildKeyValue(key, value, false));
params.append("&");
}
}
String paramsStr = params.substring(0, params.length() - 1);
return paramsStr;
}
/**
*加签
*/
public String sign(String content) throws Exception {
String sign = AlipaySignature.rsaSign(content, privateKey, CHARSET, SIGN_TYPE);
return sign;
}
/**
* 构造支付订单参数信息
*
* @param map 支付订单参数
* @return
*/
private String buildParam(Map<String, String> map) {
List<String> keys = new ArrayList<String>(map.keySet());
StringBuilder sb = new StringBuilder();
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
String value = map.get(key);
sb.append(MapConmon.buildKeyValue(key, value, true));
sb.append("&");
}
return sb.toString();
}
异步接收支付宝返回的通知信息
@ApiOperation(value = "保存支付宝异步充值成功信息")
@RequestMapping(value = "/alipay", method = RequestMethod.POST, produces = {MediaType.APPLICATION_JSON_VALUE})
public String saveAliPayInfo(HttpServletRequest request) {
LogHelper.warn("alipay异步通知开始------------------------------------------");
String result = "success";
String failResult = "failed";
try {
Map<String, String[]> map = request.getParameterMap();
Map<String, String> resultMap = MapConmon.mapConvert(map);
if (map == null || !resultMap.containsKey("trade_status") || (!resultMap.get("trade_status").equals
("TRADE_SUCCESS")&&!resultMap.get("trade_status").equals ("TRADE_FINISHED")))
return failResult;
if(!alipay.verifySign(resultMap))//验证签名
return failResult;
//支付成功后的业务,根据自己实际来写
String userId = resultMap.get("buyer_id");
double amount = Double.parseDouble(resultMap.get("total_amount"));
PayInfo info =PayInfo.getInstance(userId,"支付宝充值",amount, ConstantUtil.ALIPAY,resultMap.get
("out_trade_no"),resultMap.get("trade_no"),userId,resultMap.get("app_id"));//支付宝充值信息
String msg = transferDao.savePayInfo(info);//插入支付相关信息
if (!msg.equals("充值成功"))
result = failResult;
} catch (Exception e) {
result = failResult;
e.printStackTrace();
}
LogHelper.warn("alipay异步通知结束------------------------------------------");
return result;
}
/**
*验证签名
*/
public boolean verifySign(Map<String, String> map) throws Exception {
if (!map.containsKey("sign") || !map.containsKey("sign_type")) {
return false;
}
boolean signVerified = AlipaySignature.rsaCheckV1(map, publicKey, CHARSET, SIGN_TYPE); //调用SDK验证签名
LogHelper.warn("signVerified=" + signVerified);
return signVerified;
}
以上就是支付宝支付后台需要做的功能。