Преглед изворни кода

Merge branch 'for_member_only' of https://git.youlane.cn/server/formallProject into for_member_only

release_toaliyun_real
xhxu пре 5 година
родитељ
комит
eb2625c58c
7 измењених фајлова са 321 додато и 175 уклоњено
  1. +8
    -1
      mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java
  2. +2
    -2
      mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java
  3. +3
    -172
      mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java
  4. +28
    -0
      mallinkService/src/main/java/com/iformall/service/pay/PayAdapterResult.java
  5. +10
    -0
      mallinkService/src/main/java/com/iformall/service/pay/PayAdapterService.java
  6. +31
    -0
      mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java
  7. +239
    -0
      mallinkService/src/main/java/com/iformall/service/pay/impl/WxPayAdapterService.java

+ 8
- 1
mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java Прегледај датотеку

@@ -78,7 +78,14 @@ public class WxPayOrderController extends BaseController {
}

WxCUser user = getUser();
WxCUserBasicInfo wxCUserBasicInfo = wxCUserBasicInfoService.getById(user.getId());
if(!user.isBasicInfo()) {
return new ResultData(ErrorCode.USER_IS_NOT_MEMBER);
}
WxCUserBasicInfo wxCUserBasicInfo = wxCUserBasicInfoService.getById(user.getUserId());
if ( null == wxCUserBasicInfo) {
logger.error("会员用户不存在."+user.getUserId());
return new ResultData(ErrorCode.USER_IS_EMPTY.getCode(),"会员用户不存在."+user.getUserId());
}
if (null != wxCUserBasicInfo && EnumCreditLockedStatus.CLOSE.getCode().equals(wxCUserBasicInfo.getStatus())) {
return new ResultData(ErrorCode.MEMBER_IS_LOCKED);
}


+ 2
- 2
mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java Прегледај датотеку

@@ -6,7 +6,7 @@ import com.github.pagehelper.PageInfo;
import com.iformall.common.IdWorker;
import com.iformall.common.ResultData;
import com.iformall.domain.po.WxAppinfo;
import com.iformall.domain.po.WxCUser;
import com.iformall.domain.po.WxCUserBasicInfo;
import com.iformall.domain.po.WxCoupon;
import com.iformall.domain.po.WxMerchantBUser;
import com.iformall.domain.po.WxOrder;
@@ -27,7 +27,7 @@ public interface WxPayOrderService {
* @param payWay
* @return
*/
ResultData createPayOrder(WxAppinfo appInfo, WxCUser user, WxPayOrder record, EnumPayWay payWay);
ResultData createPayOrder(WxAppinfo appInfo, WxCUserBasicInfo user, WxPayOrder record, EnumPayWay payWay);

/**
* 刷卡支付订单


+ 3
- 172
mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java Прегледај датотеку

@@ -18,6 +18,7 @@ import com.iformall.mapper.*;
import com.iformall.pay.*;
import com.iformall.service.*;
import com.iformall.service.helper.WxPayOrderServiceHelper;
import com.iformall.service.pay.PayServiceFactory;
import com.iformall.utils.*;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
@@ -89,23 +90,6 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
@Autowired
PosCouponOrderVerifyMapper posCouponOrderVerifyMapper;

JSONObject errorMap = JSON.parseObject("{" +
"\"NOAUTH\":{\"detail\":\"商户无此接口权限\",\"reason\":\"商户未开通此接口权限\",\"resolution\":\"请商户前往申请此接口权限\"}," +
"\"NOTENOUGH\":{\"detail\":\"余额不足\",\"reason\":\"用户帐号余额不足\",\"resolution\":\"用户帐号余额不足,请用户充值或更换支付卡后再支付\"}," +
"\"ORDERPAID\":{\"detail\":\"商户订单已支付\",\"reason\":\"商户订单已支付,无需重复操作\",\"resolution\":\"商户订单已支付,无需更多操作\"}," +
"\"ORDERCLOSED\":{\"detail\":\"订单已关闭\",\"reason\":\"当前订单已关闭,无法支付\",\"resolution\":\"当前订单已关闭,请重新下单\"}," +
"\"SYSTEMERROR\":{\"detail\":\"系统错误\t\",\"reason\":\"系统超时\",\"resolution\":\"系统异常,请用相同参数重新调用\"}," +
"\"APPID_NOT_EXIST\":{\"detail\":\"APPID不存在\",\"reason\":\"参数中缺少APPID\",\"resolution\":\"请检查APPID是否正确\"}," +
"\"MCHID_NOT_EXIST\":{\"detail\":\"MCHID不存在\",\"reason\":\"参数中缺少MCHID\",\"resolution\":\"请检查MCHID是否正确\"}," +
"\"APPID_MCHID_NOT_MATCH\":{\"detail\":\"appid和mch_id不匹配\",\"reason\":\"appid和mch_id不匹配\",\"resolution\":\"请确认appid和mch_id是否匹配\"}," +
"\"LACK_PARAMS\":{\"detail\":\"缺少参数\t\",\"reason\":\"缺少必要的请求参数\",\"resolution\":\"请检查参数是否齐全\"}," +
"\"OUT_TRADE_NO_USED\":{\"detail\":\"商户订单号重复\",\"reason\":\"同一笔交易不能多次提交\",\"resolution\":\"请核实商户订单号是否重复提交\"}," +
"\"SIGNERROR\":{\"detail\":\"签名错误\",\"reason\":\"参数签名结果不正确\",\"resolution\":\"请检查签名参数和方法是否都符合签名算法要求\"}," +
"\"XML_FORMAT_ERROR\":{\"detail\":\"XML格式错误\t\",\"reason\":\"XML格式错误\",\"resolution\":\"请检查XML参数格式是否正确\"}," +
"\"REQUIRE_POST_METHOD\":{\"detail\":\"请使用post方法\",\"reason\":\"未使用post传递参数\",\"resolution\":\"请检查请求参数是否通过post方法提交\"}," +
"\"POST_DATA_EMPTY\":{\"detail\":\"post数据为空\",\"reason\":\"post数据不能为空\",\"resolution\":\"请检查post数据是否为空\"}," +
"\"NOT_UTF8\":{\"detail\":\"编码格式错误\",\"reason\":\"未使用指定编码格式\",\"resolution\":\"请使用UTF-8编码格式\"}}");

JSONObject errorMapQuery = JSON.parseObject("{" +
"\"ORDERNOTEXIST\":{\"detail\":\"此交易订单号不存在\",\"reason\":\"查询系统中不存在此交易订单号\",\"resolution\":\"该API只能查提交支付交易返回成功的订单,请商户检查需要查询的订单号是否正确\"},\n" +
"\"SYSTEMERROR\":{\"detail\":\"系统错误\t\",\"reason\":\"后台系统返回错误\",\"resolution\":\"系统异常,请再调用发起查询\"}}");
@@ -218,7 +202,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
@Override
public ResultData createPayOrder(WxAppinfo appInfo, WxCUser user, WxPayOrder record, EnumPayWay payWay) {
public ResultData createPayOrder(WxAppinfo appInfo, WxCUserBasicInfo user, WxPayOrder record, EnumPayWay payWay) {
IdWorker idworker = IdWorker.get();

EnumPayShare isShare = EnumPayShare.NO;
@@ -407,160 +391,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
}
}
if (payAccount.getType() == EnumPayMode.MCH.getCode()) {
// 统一下单 普通商户模式
String noncestr = Utility.generate32UUID();
WxPayOrderP wxPayOrderP = new WxPayOrderP();
wxPayOrderP.setOpenid(user.getOpenId());
wxPayOrderP.setAppid(user.getAppId());
wxPayOrderP.setMch_id(payAccount.getMchId());
wxPayOrderP.setNonce_str(noncestr);
wxPayOrderP.setBody(order.getDetail());
wxPayOrderP.setOut_trade_no(record.getPayOrderNo());
wxPayOrderP.setTotal_fee(order.getPayment());
wxPayOrderP.setSpbill_create_ip(record.getIp()); // 终端IP
wxPayOrderP.setGoods_tag(String.valueOf(order.getProductId()));
wxPayOrderP.setNotify_url(payAccount.getPayNotifyUrl());
wxPayOrderP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型
wxPayOrderP.setProduct_id(String.valueOf(order.getId())); // 订单ID
wxPayOrderP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentDate));
Date futureDate = new Date();
futureDate.setTime(currentDate.getTime() + 15 * 60 * 1000);
wxPayOrderP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(futureDate)); // 15分钟后结束
Map<String, String> payOrderMap = BeanUtils.toStringMap(wxPayOrderP);
wxPayOrderP.setSign(WxPayment.createSign(payOrderMap, payAccount.getApiKey()));
String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderP));
logger.info("pay order, wechat pushOrder, " + wxPayOrderP.toString() + ", response: " + response.toString());
Map<String, String> returnMap = WxPayment.xmlToMap(response);
returnMap.put("payOrderId", String.valueOf(record.getId()));
String result_code = returnMap.get("result_code");
if ("SUCCESS".equals(result_code)) {
String prepay_id = returnMap.get("prepay_id");
// update payOrder with prepay_id
record.setPrepayId(prepay_id);
record.setUpdateTime(new Date());
try {
wxPayOrderMapper.updateById(record);
} catch (Exception e) {
logger.error("pay order update error: " + record.toString());
throw new MallinkException(ErrorCode.DB_FAIL);
}

String timestamp = String.valueOf(Utility.getCurrentTimeStamp());
Map<String, String> sighMap = MapUtil.getOrderMap();
sighMap.put("appId", returnMap.get("appid"));
sighMap.put("timeStamp", timestamp);
sighMap.put("nonceStr", noncestr);
sighMap.put("package", "prepay_id=" + prepay_id);
sighMap.put("signType", "MD5");
String signAgent = WxPayment.createSign(sighMap, payAccount.getApiKey());
returnMap.put("timeStamp", timestamp);
returnMap.put("nonceStr", noncestr);
returnMap.put("package", "prepay_id=" + prepay_id);
returnMap.put("paySign", signAgent);
logger.info("back to UI: " + returnMap.toString());
return new ResultData(Result.SUCCESS, "创建支付订单成功", returnMap);
} else {
String errMsg = "";
JSONObject errObj = errorMap.getJSONObject(result_code);
if (errObj != null) {
errMsg = errObj.toJSONString();
record.setFailReason(errMsg);
} else {
errMsg = returnMap.get("return_msg");
record.setFailReason(errMsg);
}
record.setUpdateTime(new Date());
try {
wxPayOrderMapper.updateById(record);
} catch (Exception e) {
logger.error("pay order update error: " + record.toString());
throw new MallinkException(ErrorCode.DB_FAIL);
}
return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap);
}
} else {
// 统一下单 // 服务商模式
String noncestr = Utility.generate32UUID();
WxPayOrderSP wxPayOrderSP = new WxPayOrderSP();
wxPayOrderSP.setSub_openid(user.getOpenId());
wxPayOrderSP.setAppid(appInfo.getParentAppId());
wxPayOrderSP.setMch_id(payAccount.getMchId());
wxPayOrderSP.setSub_appid(user.getAppId());
wxPayOrderSP.setSub_mch_id(payAccount.getSubMchId());
wxPayOrderSP.setNonce_str(noncestr);
wxPayOrderSP.setBody(order.getDetail());
wxPayOrderSP.setOut_trade_no(record.getPayOrderNo());
wxPayOrderSP.setTotal_fee(order.getPayment().toString());
wxPayOrderSP.setSpbill_create_ip(record.getIp()); // 终端IP
wxPayOrderSP.setGoods_tag(String.valueOf(order.getProductId())); // 券ID
wxPayOrderSP.setNotify_url(payAccount.getPayNotifyUrl());
wxPayOrderSP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型
wxPayOrderSP.setProduct_id(String.valueOf(order.getProductId())); // 券ID
wxPayOrderSP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentDate));
Date futureDate = new Date();
futureDate.setTime(currentDate.getTime() + 15 * 60 * 1000);
wxPayOrderSP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(futureDate)); // 15分钟后结束
wxPayOrderSP.setSign_type("HMAC-SHA256");
wxPayOrderSP.setProfit_sharing(null);
if (isShare == EnumPayShare.YES) {
wxPayOrderSP.setProfit_sharing("Y");
}
Map<String, String> payOrderMap = BeanUtils.toStringMap(wxPayOrderSP);

wxPayOrderSP.setSign(WxPayment.createSignHMAC(payOrderMap, payAccount.getApiKey()));
String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderSP));
logger.info("pay order, wechat pushOrder, " + wxPayOrderSP.toString() + ", response: " + response.toString());
Map<String, String> returnMap = WxPayment.xmlToMap(response);
returnMap.put("payOrderId", String.valueOf(record.getId()));
String result_code = returnMap.get("result_code");
if ("SUCCESS".equals(result_code)) {
String prepay_id = returnMap.get("prepay_id");
// update payOrder with prepay_id
record.setPrepayId(prepay_id);
record.setUpdateTime(new Date());
try {
wxPayOrderMapper.updateById(record);
} catch (Exception e) {
logger.error("pay order update error: " + record.toString());
throw new MallinkException(ErrorCode.DB_FAIL);
}

String timestamp = String.valueOf(Utility.getCurrentTimeStamp());
Map<String, String> sighMap = MapUtil.getOrderMap();
sighMap.put("appId", appInfo.getAppId());
sighMap.put("timeStamp", timestamp);
sighMap.put("nonceStr", noncestr);
sighMap.put("package", "prepay_id=" + prepay_id);
sighMap.put("signType", "HMAC-SHA256");
String signAgent = WxPayment.createSignHMAC(sighMap, payAccount.getApiKey());
returnMap.put("timeStamp", timestamp);
returnMap.put("nonceStr", noncestr);
returnMap.put("package", "prepay_id=" + prepay_id);
returnMap.put("paySign", signAgent);
returnMap.put("signType", "HMAC-SHA256");
logger.info("back to UI: " + returnMap.toString());
return new ResultData(Result.SUCCESS, "创建支付订单成功", returnMap);
} else {
String errMsg = "";
JSONObject errObj = errorMap.getJSONObject(result_code);
if (errObj != null) {
errMsg = errObj.toJSONString();
record.setFailReason(errMsg);
} else {
errMsg = returnMap.get("return_msg");
record.setFailReason(errMsg);
}
record.setUpdateTime(new Date());
try {
wxPayOrderMapper.updateById(record);
} catch (Exception e) {
logger.error("pay order update error: " + record.toString());
throw new MallinkException(ErrorCode.DB_FAIL);
}
return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap);
}
}
PayServiceFactory.getPayAdapterService(payWay.getCode()).pay(payAccount, order, oldRecord, params);
} catch (RuntimeException e) {
logger.error("createwxpayorder error:",e);
throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage());


+ 28
- 0
mallinkService/src/main/java/com/iformall/service/pay/PayAdapterResult.java Прегледај датотеку

@@ -0,0 +1,28 @@
package com.iformall.service.pay;

import java.io.Serializable;

public class PayAdapterResult implements Serializable{
private static final long serialVersionUID = -6647306162758854293L;
private boolean isSuccess;
private String msg;
private Object data;
public boolean isSuccess() {
return isSuccess;
}
public void setSuccess(boolean isSuccess) {
this.isSuccess = isSuccess;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}

+ 10
- 0
mallinkService/src/main/java/com/iformall/service/pay/PayAdapterService.java Прегледај датотеку

@@ -0,0 +1,10 @@
package com.iformall.service.pay;

import com.iformall.domain.po.WxOrder;
import com.iformall.domain.po.WxPayAccount;
import com.iformall.domain.po.WxPayOrder;

public interface PayAdapterService {

public PayAdapterResult pay(WxPayAccount payAccount,WxOrder order,WxPayOrder record , Object... params);
}

+ 31
- 0
mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java Прегледај датотеку

@@ -0,0 +1,31 @@
package com.iformall.service.pay;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import com.iformall.enums.EnumPayWay;
import com.iformall.service.pay.impl.WxPayAdapterService;

/**
* 支付方式工厂
* @author alascor
*/
public class PayServiceFactory {

private static Map<Integer,PayAdapterService> serviceMap = new ConcurrentHashMap<Integer, PayAdapterService>();
public static PayAdapterService getPayAdapterService(Integer type) {
if (serviceMap.containsKey(type)) {
return serviceMap.get(type);
}else {
PayAdapterService payService = null;
if(EnumPayWay.PAY_WAY_WECHAT.getCode().intValue()==type.intValue()) {
payService = new WxPayAdapterService();
}else {
//other pay
}
serviceMap.put(type, payService);
}
return serviceMap.get(type);
}
}

+ 239
- 0
mallinkService/src/main/java/com/iformall/service/pay/impl/WxPayAdapterService.java Прегледај датотеку

@@ -0,0 +1,239 @@
package com.iformall.service.pay.impl;

import java.util.Date;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.iformall.common.ErrorCode;
import com.iformall.common.Result;
import com.iformall.common.ResultData;
import com.iformall.domain.po.WxAppinfo;
import com.iformall.domain.po.WxOrder;
import com.iformall.domain.po.WxPayAccount;
import com.iformall.domain.po.WxPayOrder;
import com.iformall.enums.EnumPayMode;
import com.iformall.enums.EnumPayShare;
import com.iformall.exception.MallinkException;
import com.iformall.pay.WxPay;
import com.iformall.pay.WxPayOrderP;
import com.iformall.pay.WxPayOrderSP;
import com.iformall.pay.WxPayment;
import com.iformall.service.pay.PayAdapterResult;
import com.iformall.service.pay.PayAdapterService;
import com.iformall.utils.BeanUtils;
import com.iformall.utils.MapUtil;
import com.iformall.utils.Utility;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class WxPayAdapterService implements PayAdapterService{

JSONObject errorMap = JSON.parseObject("{" +
"\"NOAUTH\":{\"detail\":\"商户无此接口权限\",\"reason\":\"商户未开通此接口权限\",\"resolution\":\"请商户前往申请此接口权限\"}," +
"\"NOTENOUGH\":{\"detail\":\"余额不足\",\"reason\":\"用户帐号余额不足\",\"resolution\":\"用户帐号余额不足,请用户充值或更换支付卡后再支付\"}," +
"\"ORDERPAID\":{\"detail\":\"商户订单已支付\",\"reason\":\"商户订单已支付,无需重复操作\",\"resolution\":\"商户订单已支付,无需更多操作\"}," +
"\"ORDERCLOSED\":{\"detail\":\"订单已关闭\",\"reason\":\"当前订单已关闭,无法支付\",\"resolution\":\"当前订单已关闭,请重新下单\"}," +
"\"SYSTEMERROR\":{\"detail\":\"系统错误\t\",\"reason\":\"系统超时\",\"resolution\":\"系统异常,请用相同参数重新调用\"}," +
"\"APPID_NOT_EXIST\":{\"detail\":\"APPID不存在\",\"reason\":\"参数中缺少APPID\",\"resolution\":\"请检查APPID是否正确\"}," +
"\"MCHID_NOT_EXIST\":{\"detail\":\"MCHID不存在\",\"reason\":\"参数中缺少MCHID\",\"resolution\":\"请检查MCHID是否正确\"}," +
"\"APPID_MCHID_NOT_MATCH\":{\"detail\":\"appid和mch_id不匹配\",\"reason\":\"appid和mch_id不匹配\",\"resolution\":\"请确认appid和mch_id是否匹配\"}," +
"\"LACK_PARAMS\":{\"detail\":\"缺少参数\t\",\"reason\":\"缺少必要的请求参数\",\"resolution\":\"请检查参数是否齐全\"}," +
"\"OUT_TRADE_NO_USED\":{\"detail\":\"商户订单号重复\",\"reason\":\"同一笔交易不能多次提交\",\"resolution\":\"请核实商户订单号是否重复提交\"}," +
"\"SIGNERROR\":{\"detail\":\"签名错误\",\"reason\":\"参数签名结果不正确\",\"resolution\":\"请检查签名参数和方法是否都符合签名算法要求\"}," +
"\"XML_FORMAT_ERROR\":{\"detail\":\"XML格式错误\t\",\"reason\":\"XML格式错误\",\"resolution\":\"请检查XML参数格式是否正确\"}," +
"\"REQUIRE_POST_METHOD\":{\"detail\":\"请使用post方法\",\"reason\":\"未使用post传递参数\",\"resolution\":\"请检查请求参数是否通过post方法提交\"}," +
"\"POST_DATA_EMPTY\":{\"detail\":\"post数据为空\",\"reason\":\"post数据不能为空\",\"resolution\":\"请检查post数据是否为空\"}," +
"\"NOT_UTF8\":{\"detail\":\"编码格式错误\",\"reason\":\"未使用指定编码格式\",\"resolution\":\"请使用UTF-8编码格式\"}}");
private WxPayOrderP generateWxPayOrderP(WxPayAccount payAccount, WxOrder order, WxPayOrder record,String openId,String appId,Date currentDate) throws Exception {
// 统一下单 普通商户模式
String noncestr = Utility.generate32UUID();
WxPayOrderP wxPayOrderP = new WxPayOrderP();
wxPayOrderP.setOpenid(openId);
wxPayOrderP.setAppid(appId);
wxPayOrderP.setMch_id(payAccount.getMchId());
wxPayOrderP.setNonce_str(noncestr);
wxPayOrderP.setBody(order.getDetail());
wxPayOrderP.setOut_trade_no(record.getPayOrderNo());
wxPayOrderP.setTotal_fee(order.getPayment());
wxPayOrderP.setSpbill_create_ip(record.getIp()); // 终端IP
wxPayOrderP.setGoods_tag(String.valueOf(order.getProductId()));
wxPayOrderP.setNotify_url(payAccount.getPayNotifyUrl());
wxPayOrderP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型
wxPayOrderP.setProduct_id(String.valueOf(order.getId())); // 订单ID
wxPayOrderP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentDate));
Date futureDate = new Date();
futureDate.setTime(currentDate.getTime() + 15 * 60 * 1000);
wxPayOrderP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(futureDate)); // 15分钟后结束
Map<String, String> payOrderMap = BeanUtils.toStringMap(wxPayOrderP);
wxPayOrderP.setSign(WxPayment.createSign(payOrderMap, payAccount.getApiKey()));
return wxPayOrderP;
}
private PayAdapterResult getOrderPResult(Map<String, String> returnMap,WxPayOrder record,String noncestr) {
returnMap.put("payOrderId", String.valueOf(record.getId()));
String result_code = returnMap.get("result_code");
if ("SUCCESS".equals(result_code)) {
String prepay_id = returnMap.get("prepay_id");
// update payOrder with prepay_id
record.setPrepayId(prepay_id);
record.setUpdateTime(new Date());
try {
wxPayOrderMapper.updateById(record);
} catch (Exception e) {
log.error("pay order update error: " + record.toString());
throw new MallinkException(ErrorCode.DB_FAIL);
}

String timestamp = String.valueOf(Utility.getCurrentTimeStamp());
Map<String, String> sighMap = MapUtil.getOrderMap();
sighMap.put("appId", returnMap.get("appid"));
sighMap.put("timeStamp", timestamp);
sighMap.put("nonceStr", noncestr);
sighMap.put("package", "prepay_id=" + prepay_id);
sighMap.put("signType", "MD5");
String signAgent = WxPayment.createSign(sighMap, payAccount.getApiKey());
returnMap.put("timeStamp", timestamp);
returnMap.put("nonceStr", noncestr);
returnMap.put("package", "prepay_id=" + prepay_id);
returnMap.put("paySign", signAgent);
log.info("back to UI: " + returnMap.toString());
return new ResultData(Result.SUCCESS, "创建支付订单成功", returnMap);
} else {
String errMsg = "";
JSONObject errObj = errorMap.getJSONObject(result_code);
if (errObj != null) {
errMsg = errObj.toJSONString();
record.setFailReason(errMsg);
} else {
errMsg = returnMap.get("return_msg");
record.setFailReason(errMsg);
}
record.setUpdateTime(new Date());
try {
wxPayOrderMapper.updateById(record);
} catch (Exception e) {
logger.error("pay order update error: " + record.toString());
throw new MallinkException(ErrorCode.DB_FAIL);
}
return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap);
}
}
private WxPayOrderSP generateWxPayOrderSP(WxPayAccount payAccount, WxOrder order, WxPayOrder record,WxAppinfo appInfo,String openId,String parentAppId,String appId,Date currentDate,EnumPayShare isShare) throws Exception {
String noncestr = Utility.generate32UUID();
WxPayOrderSP wxPayOrderSP = new WxPayOrderSP();
wxPayOrderSP.setSub_openid(openId);
wxPayOrderSP.setAppid(appInfo.getParentAppId());
wxPayOrderSP.setMch_id(payAccount.getMchId());
wxPayOrderSP.setSub_appid(appId);
wxPayOrderSP.setSub_mch_id(payAccount.getSubMchId());
wxPayOrderSP.setNonce_str(noncestr);
wxPayOrderSP.setBody(order.getDetail());
wxPayOrderSP.setOut_trade_no(record.getPayOrderNo());
wxPayOrderSP.setTotal_fee(order.getPayment().toString());
wxPayOrderSP.setSpbill_create_ip(record.getIp()); // 终端IP
wxPayOrderSP.setGoods_tag(String.valueOf(order.getProductId())); // 券ID
wxPayOrderSP.setNotify_url(payAccount.getPayNotifyUrl());
wxPayOrderSP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型
wxPayOrderSP.setProduct_id(String.valueOf(order.getProductId())); // 券ID
wxPayOrderSP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentDate));
Date futureDate = new Date();
futureDate.setTime(currentDate.getTime() + 15 * 60 * 1000);
wxPayOrderSP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(futureDate)); // 15分钟后结束
wxPayOrderSP.setSign_type("HMAC-SHA256");
wxPayOrderSP.setProfit_sharing(null);
if (isShare == EnumPayShare.YES) {
wxPayOrderSP.setProfit_sharing("Y");
}
Map<String, String> payOrderMap = BeanUtils.toStringMap(wxPayOrderSP);
wxPayOrderSP.setSign(WxPayment.createSignHMAC(payOrderMap, payAccount.getApiKey()));
return wxPayOrderSP;
}

@Override
public PayAdapterResult pay(WxPayAccount payAccount, WxOrder order, WxPayOrder record, Object... params) {
WxAppinfo appInfo = (WxAppinfo) params[01];
String openId = (String) params[1];
String appId = (String) params[2];
Date currentDate = (Date) params[3];
EnumPayShare isShare = (EnumPayShare) params[4];
if (payAccount.getType() == EnumPayMode.MCH.getCode()) {
WxPayOrderP wxPayOrderP = generateWxPayOrderP(payAccount,order,record,openId,appId,currentDate);
String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderP));
log.info("pay order, wechat pushOrder, " + wxPayOrderP.toString() + ", response: " + response.toString());
Map<String, String> returnMap = WxPayment.xmlToMap(response);
} else {
// 统一下单 // 服务商模式
WxPayOrderSP wxPayOrderSP = generateWxPayOrderSP(payAccount,order,record,openId,parentAppId,appId,currentDate,isShare);
String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderSP));
log.info("pay order, wechat pushOrder, " + wxPayOrderSP.toString() + ", response: " + response.toString());
Map<String, String> returnMap = WxPayment.xmlToMap(response);
returnMap.put("payOrderId", String.valueOf(record.getId()));
String result_code = returnMap.get("result_code");
if ("SUCCESS".equals(result_code)) {
String prepay_id = returnMap.get("prepay_id");
// update payOrder with prepay_id
record.setPrepayId(prepay_id);
record.setUpdateTime(new Date());
try {
wxPayOrderMapper.updateById(record);
} catch (Exception e) {
logger.error("pay order update error: " + record.toString());
throw new MallinkException(ErrorCode.DB_FAIL);
}

String timestamp = String.valueOf(Utility.getCurrentTimeStamp());
Map<String, String> sighMap = MapUtil.getOrderMap();
sighMap.put("appId", appInfo.getAppId());
sighMap.put("timeStamp", timestamp);
sighMap.put("nonceStr", noncestr);
sighMap.put("package", "prepay_id=" + prepay_id);
sighMap.put("signType", "HMAC-SHA256");
String signAgent = WxPayment.createSignHMAC(sighMap, payAccount.getApiKey());
returnMap.put("timeStamp", timestamp);
returnMap.put("nonceStr", noncestr);
returnMap.put("package", "prepay_id=" + prepay_id);
returnMap.put("paySign", signAgent);
returnMap.put("signType", "HMAC-SHA256");
logger.info("back to UI: " + returnMap.toString());
return new ResultData(Result.SUCCESS, "创建支付订单成功", returnMap);
} else {
String errMsg = "";
JSONObject errObj = errorMap.getJSONObject(result_code);
if (errObj != null) {
errMsg = errObj.toJSONString();
record.setFailReason(errMsg);
} else {
errMsg = returnMap.get("return_msg");
record.setFailReason(errMsg);
}
record.setUpdateTime(new Date());
try {
wxPayOrderMapper.updateById(record);
} catch (Exception e) {
logger.error("pay order update error: " + record.toString());
throw new MallinkException(ErrorCode.DB_FAIL);
}
return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap);
}
}
}

}

Loading…
Откажи
Сачувај