importcom.alipay.api.AlipayApiException;importcom.alipay.api.AlipayClient;importcom.alipay.api.DefaultAlipayClient;importcom.alipay.api.domain.AlipayTradeAppPayModel;importcom.alipay.api.internal.util.AlipaySignature;importcom.alipay.api.request.AlipayTradeAppPayRequest;importcom.alipay.api.request.AlipayTradeQueryRequest;importcom.alipay.api.response.AlipayTradeAppPayResponse;importcom.alipay.api.response.AlipayTradeQueryResponse;importcom.aone.app.common.ali.pay.AlipayConfig;importcom.aone.app.service.AliAppPayService;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importorg.springframework.util.StringUtils;importjava.util.HashMap;importjava.util.Map;
@Servicepublic class AliAppAppPayServiceImpl implementsAliAppPayService {private static final Logger logger = LoggerFactory.getLogger("AliAppAppPayServiceImpl");/*** 预下单
*@paramtype
*@paramout_trade_no
*@parammoney
*@return
*/
public MapaliPay(String type,String out_trade_no,String money){
Map map=newHashMap();
map.put("code", "201");
map.put("msg", "解析失败");
map.put("orderString", "");//实例化客户端
AlipayClient alipayClient = newDefaultAlipayClient(AlipayConfig.URL,AlipayConfig.APPID, AlipayConfig.PRIVATE_KEY,AlipayConfig.FORMAT,AlipayConfig.CHARSET,AlipayConfig.PUBLIC_KEY,AlipayConfig.SIGNTYPE);//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = newAlipayTradeAppPayRequest();//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = newAlipayTradeAppPayModel();
model.setBody("支付");//对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。
model.setSubject("App支付宝支付");//商品的标题/交易标题/订单标题/订单关键字等
model.setOutTradeNo(out_trade_no);//商户网站唯一订单号
model.setTimeoutExpress("30m");//该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。//注:若为空,则默认为15d。
model.setTotalAmount("0.01");//订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
model.setProductCode("QUICK_MSECURITY_PAY");//销售产品码,商家和支付宝签约的产品码,为固定值 QUICK_MSECURITY_PAY
model.setPassbackParams(type); //公用参数(附加数据)
request.setBizModel(model);
request.setNotifyUrl(AlipayConfig.notify_url);try{//这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response =alipayClient.sdkExecute(request);//System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。//@TODO 返回支付所需参数
map.put("code", "200");
map.put("msg", "ok");
map.put("orderString", response.getBody());returnmap;
}catch(AlipayApiException e) {
e.printStackTrace();
}returnmap;
}/*** 回调
*@paramparams*/
public void notify(Mapparams){try{//调用SDK验证签名
boolean flag=AlipaySignature.rsaCheckV1(params, AlipayConfig.PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGNTYPE);
logger.info("验签结果:{}", flag);if(flag){
logger.info("支付状态为:{}", params.get("trade_status"));//签名通过
if("TRADE_SUCCESS".equals(params.get("trade_status"))){//支付成功//付款金额
String amount = params.get("buyer_pay_amount");//商户订单号
String out_trade_no = params.get("out_trade_no");//支付宝交易号
String trade_no = params.get("trade_no");//公用参数(附加数据)
String passback_params = params.get("passback_params");//@TODO 数据库操作 推送操作
if(StringUtils.isEmpty(passback_params)){
logger.info("附加数据类型为:{}", passback_params);
}else{//@TODO 预支付下单后回调的逻辑
}
}
}
}catch(AlipayApiException e) {
logger.info("==================验签失败 !");
e.printStackTrace();
}
}
}