package com.hugnew.sps.services.pay.strategy;
import com.hugnew.core.util.PropertiesUtil;
import com.hugnew.core.web.system.listener.InitListener;
import com.hugnew.sps.enums.PayType;
import com.hugnew.sps.services.ICheckSellerService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.Map;
/**
* 支付宝app支付(对接移动支付,包含国内、国际)
* Created by Martin on 2016/7/01.
*/
public class AlipayAppStrategy implements PayStrategy {
private static Logger logger = LoggerFactory.getLogger(AlipayAppStrategy.class);
@Override
public String generatePayParams(PayType payType, Map<String, Object> params) {
String retUrl = null;
if (params.size() > 0 && null != params.get("retUrl")) {
retUrl = (String) params.get("retUrl");
}
String sellerCode = (String) params.get("sellerCode");
ICheckSellerService checkSellerService = (ICheckSellerService) InitListener.context.getBean("checkSellerService");
if (checkSellerService.isUseGlobalPay(sellerCode)) {
//国际支付
return makeGlobalParam(params);
} else {
//国内支付
return makeMainParams(params, retUrl);
}
}
private String makeGlobalParam(Map<String, Object> params) {
StringBuffer sb = new StringBuffer();
// 签约合作者身份ID
sb.append("partner=\"").append(PropertiesUtil.getValue("pay.request.alipayAppGlobal.partner")).append("\"");
// 签约卖家支付宝账号
sb.append("&seller_id=\"").append(PropertiesUtil.getValue("pay.request.alipayAppGlobal.seller_email")).append("\"");
// 商户网站唯一订单号
sb.append("&out_trade_no=\"").append((String) params.get("payCode")).append("\"");
// 商品名称
sb.append("&subject=\"").append(params.get("sellerName")).append(params.get("orderCode")).append("\"");
// 商品详情
sb.append("&body=\"").append(PropertiesUtil.getValue("pay.request.alipayAppGlobal.body")).append("\"");
// 商品金额
sb.append("&rmb_fee=\"").append(String.valueOf(((BigDecimal) params.get("toPay")).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue())).append("\"");
sb.append("¤cy=\"").append(PropertiesUtil.getValue("pay.request.alipayAppGlobal.currency")).append("\"");
sb.append("&forex_biz=\"").append(PropertiesUtil.getValue("pay.request.alipayAppGlobal.forex_biz")).append("\"");
// 服务器异步通知页面路径
sb.append("¬ify_url=\"").append(PropertiesUtil.getValue("pay.notify.alipay.globalApp.url")).append("\"");
// 服务接口名称, 固定值
sb.append("&service=\"").append(PropertiesUtil.getValue("pay.request.alipayAppGlobal.service")).append("\"");
// 支付类型, 固定值
sb.append("&payment_type=\"").append(PropertiesUtil.getValue("pay.request.alipayAppGlobal.payment_type")).append("\"");
// 参数编码, 固定值
sb.append("&_input_charset=\"").append(PropertiesUtil.getValue("pay.request.alipayAppGlobal.input_charset")).append("\"");
sb.append("&appenv=").append("\"").append(PropertiesUtil.getValue("pay.request.alipayAppGlobal.appenv")).append("\"");
String sign = com.hugnew.sps.services.pay.util.app.ali.global.sign.RSA.sign(sb.toString(), PropertiesUtil.getValue("pay.request.alipayAppGlobal.private_key"), PropertiesUtil.getValue("pay.request.alipayAppGlobal.input_charset"));
try {
sign = URLEncoder.encode(sign, PropertiesUtil.getValue("pay.request.alipayAppGlobal.input_charset"));
} catch (UnsupportedEncodingException e) {
logger.error("alipayGlobal app sign encode error,ex:{}",e.getMessage());
}
String sHtmlText = sb.append("&sign=\"").append(sign).append("\"&sign_type=\"").append(PropertiesUtil.getValue("pay.request.alipayAppGlobal.sign_type")).append("\"").toString();
if(logger.isDebugEnabled()){
logger.debug("alipay参数信息:{}", sHtmlText);
}
return sHtmlText;
}
private String makeMainParams(Map<String, Object> params, String retUrl) {
StringBuffer sb = new StringBuffer();
// 签约合作者身份ID
sb.append("partner=\"").append(PropertiesUtil.getValue("pay.request.alipayAppMain.partner")).append("\"");
// 签约卖家支付宝账号
sb.append("&seller_id=\"").append(PropertiesUtil.getValue("pay.request.alipayAppMain.seller_email")).append("\"");
// 商户网站唯一订单号
sb.append("&out_trade_no=\"").append((String) params.get("payCode")).append("\"");
// 商品名称
sb.append("&subject=\"").append(params.get("sellerName")).append(params.get("orderCode")).append("\"");
// 商品详情
sb.append("&body=\"").append(PropertiesUtil.getValue("pay.request.alipayAppMain.body")).append("\"");
// 商品金额
sb.append("&total_fee=\"").append(String.valueOf(((BigDecimal) params.get("toPay")).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue())).append("\"");
// 服务器异步通知页面路径
sb.append("¬ify_url=\"").append(PropertiesUtil.getValue("pay.notify.alipay.mainApp.url")).append("\"");
// 服务接口名称, 固定值
sb.append("&service=\"").append(PropertiesUtil.getValue("pay.request.alipayAppMain.service")).append("\"");
// 支付类型, 固定值
sb.append("&payment_type=\"").append(PropertiesUtil.getValue("pay.request.alipayAppMain.payment_type")).append("\"");
// 参数编码, 固定值
sb.append("&_input_charset=\"").append(PropertiesUtil.getValue("pay.request.alipayAppMain.input_charset")).append("\"");
// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
sb.append("&return_url=\"").append(null != retUrl ? retUrl : PropertiesUtil.getValue("pay.request.alipayAppMain.retUrl")).append("\"");
String sign = com.hugnew.sps.services.pay.util.app.ali.main.sign.RSA.sign(sb.toString(), PropertiesUtil.getValue("pay.request.alipayAppMain.private_key"), PropertiesUtil.getValue("pay.request.alipayAppMain.input_charset"));
try {
sign = URLEncoder.encode(sign, PropertiesUtil.getValue("pay.request.alipayAppMain.input_charset"));
} catch (UnsupportedEncodingException e) {
logger.error("alipayMain app sign encode error,ex:{}", e.getMessage());
}
String sHtmlText = sb.append("&sign=\"").append(sign).append("\"&sign_type=\"").append(PropertiesUtil.getValue("pay.request.alipayAppMain.sign_type")).append("\"").toString();
if(logger.isDebugEnabled()){
logger.debug("alipay参数信息:{}", sHtmlText);
}
return sHtmlText;
}
}