1.public ResultObject forNotSupSwSendAlipayRequest(String orderNo) {
//獲取訂單信息
BaseMapEntity orderParamMap = new BaseMapEntity();
orderParamMap.put("orderNo",orderNo);
orderParamMap.put("status",7);//訂單狀態(1.待車主接單 2.待租客支付 3.租客取車選擇 4.待車主確認交車 5.待租客確認取車 6.車輛使用中 7.待車主確認還車 8.租客押金凍結 9.待車主確認退還租客押金 10已完成 11.已取消)
BaseMapEntity vehicleOrderMap = vehicleOrderDao.queryVehicleOrderInfo(orderParamMap);
if(null == vehicleOrderMap){
return ResultObjectDto.initError(1, "訂單不存在或狀態已改變");
}
// TODO chenCang 2018-11-26 增長凍結轉支付邏輯
BaseMapEntity waterMap = new BaseMapEntity();
waterMap.put("orderNo", orderNo);
waterMap.put("profitType", 3);
waterMap.put("purseChannel", 4);
//查詢訂單流水: 不管有沒有預受權,接下來的分帳操做必定會完成
BaseMapEntity userPurse = userPurseWaterDao.selectByOrderNo(waterMap);
if (userPurse != null) {
String tradeNo = userPurse.getString("thirdTradeNo"); //支付寶交易流水號
if (!StringUtils.isBlank(tradeNo)) {
String realCostStr = vehicleOrderMap.getString("orderRealCost");
String depositStr = vehicleOrderMap.getString("orderCostDeposit");
BigDecimal realCost = new BigDecimal(realCostStr);
if (!StringUtils.isBlank(depositStr)) {
realCost = realCost.subtract(new BigDecimal(depositStr));
}
//預受權轉支付
String payUserId = userPurse.getString("payUserId");
AlipayUtils.authTradePay(orderNo,tradeNo,"預受權轉支付",realCost.toString(),null,"NOT_COMPLETE",payUserId,AlipayBusiTypeEnum.ALPAY300);
}
}
return ResultObjectDto.initOk();
}java
2. /**
* 支付寶受權轉支付
* @Date 2018/11/15 14:02
* @Param orderNo 訂單號
* @Param authNo 預受權凍結交易號
* @Param subject 解凍轉支付標題,用於展現在支付寶帳單中
* @Param amount 結算支付金額
* @Param body 備註信息
* @Param authConfirmMode 預受權確認模式,受權轉交易請求中傳入,適用於預受權轉交易業務使用,COMPLETE:轉交易支付完成結束預受權,解凍剩餘金額; NOT_COMPLETE:轉交易支付完成不結束預受權,不解凍剩餘金額
* @Param busiType 業務類型
* @return java.lang.String
**/
public static String authTradePay(
String orderNo,
String authNo,
String subject,
String amount,
String body,
String authConfirmMode,
String payUserId,
AlipayBusiTypeEnum busiType) {
String alipaySeller = ConfigUtil.getSettings("alipay_seller");api
String outOrderNo = orderNo + Long.toString(System.currentTimeMillis());
AlipayClient alipayClient = getAlipayClient();
AlipayTradePayRequest request = new AlipayTradePayRequest();
AlipayTradePayModel model = new AlipayTradePayModel();
model.setOutTradeNo(outOrderNo); // 預受權轉支付商戶訂單號,爲新的商戶交易流水號;若是重試發起扣款,商戶訂單號不要變;
model.setProductCode("PRE_AUTH_ONLINE"); // 固定值PRE_AUTH_ONLINE
model.setAuthNo(authNo); // 填寫預受權凍結交易號
model.setSubject(subject); // 解凍轉支付標題,用於展現在支付寶帳單中
model.setTotalAmount(amount); // 結算支付金額
model.setSellerId(alipaySeller); // 填寫賣家支付寶帳戶pid
model.setBuyerId(payUserId); // 填寫預受權用戶uid,經過預受權凍結接口返回的payer_user_id字段獲取
//model.setStoreId("test_store_id"); // 填寫實際交易發生的終端編號,與預受權的outStoreCode保持一致便可
model.setBody(body); // 可填寫備註信息
model.setAuthConfirmMode(authConfirmMode);//必須使用COMPLETE,傳入該值用戶剩餘金額會自動解凍
request.setBizModel(model);
String notifyUrl = ConfigUtil.getSettings("pament_domain")+"/api/pay/alipaycallback/" + busiType.getBusiTypeCode() + "/dealBusinessForAlipayCallback.do";
request.setNotifyUrl(notifyUrl);//異步通知地址,必填,該接口只經過該參數進行異步通知微信
String result = "";
try{
AlipayTradePayResponse response = alipayClient.execute(request);
if(response.isSuccess()){
logger.info("訂單:"+orderNo+"支付寶受權轉支付成功===>"+response.getBody());
result = response.getBody();
} else {
logger.info("訂單:"+orderNo+"支付寶受權轉支付失敗"+response.getMsg());
}
//處理交易流水記錄
BaseMapEntity waterMap = new BaseMapEntity();
waterMap.put("className", "com.ds.tech.service.util.alibaba.AlipayUtils");
waterMap.put("methodName", "authTradePay");
waterMap.put("tradeType", "2"); //交易方式:1.銀行卡 2.支付寶 3.微信
waterMap.put("tradeInput", JSONObject.toJSON(request).toString());
waterMap.put("tradeOutput", JSONObject.toJSON(response).toString());
waterMap.put("tradeTime", new Date());
userPurseWaterHisMapper.insertUserPurseWaterHistory(waterMap);
}catch (AlipayApiException e){
logger.info(ExceptionUtil.getExceptionStr("訂單:"+orderNo+"支付寶受權轉支付失敗",e));
}app
return result;
}dom
3. 異步