说明:
product_code参数为销售产品码,与支付宝签约的产品码名称,此参数一般为必填参数,请严格按照开放平台文档要求传递
示例:
1.电脑网站支付产品alipay.trade.page.pay接口中,product_code为:FAST_INSTANT_TRADE_PAY
2.手机网站支付产品alipay.trade.wap.pay接口中,product_code为:QUICK_WAP_WAY
3.当面付条码支付产品alipay.trade.pay接口中,product_code为:FACE_TO_FACE_PAYMENT
4.APP支付产品alipay.trade.app.pay接口中,product_code为:QUICK_MSECURITY_PAY
注意点:
1.product_code参数不得为空
2. product_code不得传错
private AlipayClient alipayClient;
AlipayClient getAlipayClient(){
if(alipayClient == null){
alipayClient = new DefaultAlipayClient(ProjectConsts.ALI_PAY_URL,
appId, rsaPrivateKey, ProjectConsts.aliFormat, ProjectConsts.aliCharset, rsaPublicKey, ProjectConsts.aliSignType); //获得初始化的AlipayClient
}
return alipayClient;
}
/**
* 支付宝支付
*/
public void aliPrepay(HttpServletResponse response) {
try{
String form = generateAliPay();
if(!"err".equals(form)){
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(form);// 直接将完整的表单html输出到页面
response.getWriter().flush();
}
}catch (Exception e){
System.out.println("支付失败");
}
}
/**
* 支付宝方面订单号获取
*/
public String generateAliPay(){
AlipayClient alipayClient = getAlipayClient();
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
// 封装请求支付信息
AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
model.setOutTradeNo("1");//本地订单号
model.setSubject("黑人牙膏");//订单标题
Integer totalAmount = 10;//订单总金额(单位元精确小数后两位)
model.setTotalAmount(String.valueOf(totalAmount));
model.setBody("好用");//产品描述
model.setProductCode("QUICK_WAP_WAY");//销售产品码
alipayRequest.setBizModel(model);
// 设置异步通知地址
alipayRequest.setNotifyUrl("https://tronsis.test.com/demo/com/ali/pay");
// 设置同步地址
alipayRequest.setReturnUrl("https://tronsis.test.com");
String form = "";
try {
// logger.info("alipay_request = "+ TJson.objToStr(alipayRequest));
// 调用SDK生成表单
form = alipayClient.pageExecute(alipayRequest).getBody();//调用SDK生成表单
// logger.info("form = "+form);
} catch (Exception e) {
System.out.println("支付出错");
}
return form;
}
-------------------------------------------------------------------------------------------------回调
/**
* 支付宝方面异步回调
* @param request
* @return
*/
public String AlipayCallBack(HttpServletRequest request){
//获取支付宝POST过来反馈信息
Map
params = new HashMap();
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
params.put(name, valueStr);
}
logger.info("params = "+ TJson.objToStr(params));
boolean verify_result = rsaCheck(params);
if(verify_result && dealWithAliPayChargeOrder(params)){
return "success";
}
return "false";
}
/**
* 订单验证
* @param params
* @return
*/
@Transactional
public boolean dealWithAliPayChargeOrder(Map params) {
String outTradeNo = params.get("out_trade_no");
Order order = orderMapper.selectByOutTradeNo(outTradeNo);
if (order == null) {
logger.info("订单" + outTradeNo + "不存在");
return false;
}
boolean locked = distributeLocker.lock(ProjectConsts.USER_ALIPAY_DEAL_LOCK_KEY);
try {
if (locked) {
String totalAmount = params.get("total_amount");
double totalPrice = Double.parseDouble(totalAmount) * 100;
if(order.getTotalAmount() != Math.round(totalPrice)){
logger.info("alipay和订单金额不一致");
return false;
}
if(totalPrice < 0 || order.getTotalAmount() < 0){
logger.info("alipay或订单金额为负");
return false;
}
//set done
order.setCreatOn(LocalDateTime.now());
order.setUpdateOn(LocalDateTime.now());
order.setStatus(ClientOrderStatus.PAYED);
//后台订单状态初始化为 等待接待
order.setServiceStatus(ServiceStatus.SERVICE_WAIT);
libraOrderRepository.save(order);
}
} finally {
if (locked) {
//TODO + order.getUserId()
distributeLocker.unlock(ProjectConsts.USER_ALIPAY_DEAL_LOCK_KEY);
}
}
return false;
}
/**
* 验证RSA签名
* @param params
* @return
*/
public boolean rsaCheck(Map params) {
try {
boolean verify_result = AlipaySignature.rsaCheckV1(params, rsaPublicKey, "utf-8", "RSA2");
logger.info("verify_result = " + verify_result);
return verify_result;
} catch (AlipayApiException e) {
System.out.println("验证签名失败");
throw CommonException.PAY_FAIL;
}
}