| @@ -6,7 +6,8 @@ package com.iformall.enums; | |||
| public enum EnumPayVersion { | |||
| WX_PAY_V2(1, "微信支付2.0,老版本"), | |||
| WX_PAY_V3(2, "微信支付3.0,对接电商收付通"), | |||
| WX_PAY_V3(2, "微信支付3.0,暂时还未接"), | |||
| WX_PAY_V3_SFT(7,"对接电商收付通版本"), | |||
| DY_PAY_V2(3,"抖音支付2.0,对接商品库"), | |||
| NEU_POS_V1(4,"东软POS支付1.0版本"), | |||
| NO_VERSION(5,"无需支付,无版本"), | |||
| @@ -10,10 +10,10 @@ import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils; | |||
| import com.github.binarywang.wxpay.exception.WxPayException; | |||
| import com.github.binarywang.wxpay.service.WxPayService; | |||
| import com.github.binarywang.wxpay.v3.util.RsaCryptoUtil; | |||
| import com.iformall.service.pay.service.pay.wx.v3.entity.CombineCloseReq; | |||
| import com.iformall.service.pay.service.pay.wx.v3.entity.CombinePayCommonMiniAppReq; | |||
| import com.iformall.service.pay.service.pay.wx.v3.entity.PayCommonMiniAppReq; | |||
| import com.iformall.service.pay.service.pay.wx.v3.entity.PayQueryReq; | |||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTCombineCloseReq; | |||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTCombinePayCommonMiniAppReq; | |||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTPayCommonMiniAppReq; | |||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTPayQueryReq; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| @@ -89,7 +89,7 @@ public class WxPayV3 { | |||
| * 电商收付通-普通支付-小程序下单 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_3.shtml | |||
| * @throws WxPayException | |||
| */ | |||
| public static String payCommonWithMiniApp(WxPayService payService,PayCommonMiniAppReq payReq) throws WxPayException { | |||
| public static String payCommonWithMiniApp(WxPayService payService,SFTPayCommonMiniAppReq payReq) throws WxPayException { | |||
| return payService.postV3WithWechatpaySerial(PAY_COMMON_MINIAPP_URL, JSON.toJSONString(payReq)); | |||
| } | |||
| @@ -97,7 +97,7 @@ public class WxPayV3 { | |||
| * 电商收付通-普通支付-查询 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_5.shtml | |||
| * @throws WxPayException | |||
| */ | |||
| public static String payCommonQuery(WxPayService payService,PayQueryReq payQuery) throws WxPayException { | |||
| public static String payCommonQuery(WxPayService payService,SFTPayQueryReq payQuery) throws WxPayException { | |||
| return payService.postV3WithWechatpaySerial(String.format(PAY_COMMON_QUERY_URL, payQuery.getOut_trade_no()), JSON.toJSONString(payQuery)); | |||
| } | |||
| @@ -105,7 +105,7 @@ public class WxPayV3 { | |||
| * 电商收付通-合单支付-小程序下单https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_4.shtml | |||
| * @throws WxPayException | |||
| */ | |||
| public static String payCombineCommonWithMiniApp(WxPayService payService,CombinePayCommonMiniAppReq payReq) throws WxPayException { | |||
| public static String payCombineCommonWithMiniApp(WxPayService payService,SFTCombinePayCommonMiniAppReq payReq) throws WxPayException { | |||
| return payService.postV3WithWechatpaySerial(PAY_COMBINE_MINIAPP_URL, JSON.toJSONString(payReq)); | |||
| } | |||
| @@ -113,7 +113,7 @@ public class WxPayV3 { | |||
| * 电商收付通-合单支付-查询 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_11.shtml | |||
| * @throws WxPayException | |||
| */ | |||
| public static String payCombineQuery(WxPayService payService,PayQueryReq payQuery) throws WxPayException { | |||
| public static String payCombineQuery(WxPayService payService,SFTPayQueryReq payQuery) throws WxPayException { | |||
| return payService.postV3WithWechatpaySerial(String.format(PAY_COMBINE_QUERY_URL, payQuery.getOut_trade_no()), null); | |||
| } | |||
| @@ -122,7 +122,7 @@ public class WxPayV3 { | |||
| * 电商收付通-普通支付-关闭 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_11.shtml | |||
| * @throws WxPayException | |||
| */ | |||
| public static String payCommonClose(WxPayService payService,PayQueryReq payQuery) throws WxPayException { | |||
| public static String payCommonClose(WxPayService payService,SFTPayQueryReq payQuery) throws WxPayException { | |||
| return payService.postV3WithWechatpaySerial(String.format(PAY_COMMON_CLOSE_ORDER_URL, payQuery.getOut_trade_no()), JSON.toJSONString(payQuery)); | |||
| } | |||
| @@ -131,7 +131,7 @@ public class WxPayV3 { | |||
| * 电商收付通-合单支付-关闭 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_12.shtml | |||
| * @throws WxPayException | |||
| */ | |||
| public static String payCombineClose(WxPayService payService,CombineCloseReq closeOrder) throws WxPayException { | |||
| public static String payCombineClose(WxPayService payService,SFTCombineCloseReq closeOrder) throws WxPayException { | |||
| return payService.postV3WithWechatpaySerial(String.format(PAY_COMBINE_CLOSE_ORDER_URL, closeOrder.getCombine_out_trade_no()), JSON.toJSONString(closeOrder)); | |||
| } | |||
| @@ -448,7 +448,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { | |||
| } | |||
| int share_amount = 0; | |||
| int rate_amount = 0; | |||
| 11111111111111111111 | |||
| //TODO 11111111111111111111 | |||
| //todo 注意购物车模式(需测试)每笔子订单算法可能与总订单算法有差 | |||
| for (WxOrder o : orderList) { | |||
| Long merchant_id = null; | |||
| @@ -22,12 +22,11 @@ import com.iformall.service.pay.service.pay.CDrivingPayService; | |||
| import com.iformall.service.pay.service.pay.CPassivePayService; | |||
| import com.iformall.service.pay.service.pay.PayAdapterService; | |||
| import com.iformall.service.pay.service.pay.douyin.v1.miniApp.TtMiniAppPayAdapterService; | |||
| import com.iformall.service.pay.service.pay.wx.sft.h5.WxH5PaySFTService; | |||
| import com.iformall.service.pay.service.pay.wx.sft.miniApp.appPay.WxMiniAppPaySFTAdapterService; | |||
| import com.iformall.service.pay.service.pay.wx.v2.h5.WxH5PayService; | |||
| import com.iformall.service.pay.service.pay.wx.v2.miniApp.appPay.WxMiniAppPayAdapterService; | |||
| import com.iformall.service.pay.service.pay.wx.v2.miniApp.maPay.WxMiniMaPayAdapterService; | |||
| import com.iformall.service.pay.service.pay.wx.v3.h5.WxH5PayV3Service; | |||
| import com.iformall.service.pay.service.pay.wx.v3.miniApp.appPay.WxMiniAppPayV3AdapterService; | |||
| import com.iformall.service.pay.service.pay.wx.v3.miniApp.maPay.WxMiniMaPayV3AdapterService; | |||
| import com.iformall.service.pay.service.refund.RefundPayAdapterService; | |||
| import com.iformall.service.pay.service.share.PayShareAdapterService; | |||
| @@ -47,17 +46,15 @@ public class PayServiceFactory { | |||
| @Autowired | |||
| WxMiniAppPayAdapterService wxMiniAppPayService; | |||
| @Autowired | |||
| WxMiniAppPayV3AdapterService wxMiniAppPayV3AdapterService; | |||
| WxMiniAppPaySFTAdapterService wxMiniAppPayV3AdapterService; | |||
| @Autowired | |||
| WxMiniMaPayAdapterService wxMiniAppMaPayService; | |||
| @Autowired | |||
| WxMiniMaPayV3AdapterService wxMiniMaPayV3AdapterService; | |||
| @Autowired | |||
| WxH5PayService wxH5PayService; | |||
| @Autowired | |||
| WxH5PayV3Service wxH5PayV3Service; | |||
| WxH5PaySFTService wxH5PayV3Service; | |||
| @Autowired | |||
| TtMiniAppPayAdapterService ttMiniAppPayService; | |||
| @@ -89,11 +86,11 @@ public class PayServiceFactory { | |||
| if (null == serviceMap) { | |||
| serviceMap = new ConcurrentHashMap<String,PayAdapterService>(); | |||
| serviceMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxMiniAppPayService); | |||
| serviceMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxMiniAppPayV3AdapterService); | |||
| serviceMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxMiniAppPayV3AdapterService); | |||
| serviceMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxMiniAppMaPayService); | |||
| serviceMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxMiniMaPayV3AdapterService); | |||
| serviceMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxMiniAppMaPayService); | |||
| serviceMap.put(EnumPayWay.PAY_WAY_WECHAT_WAP.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxH5PayService); | |||
| serviceMap.put(EnumPayWay.PAY_WAY_WECHAT_WAP.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxH5PayV3Service); | |||
| serviceMap.put(EnumPayWay.PAY_WAY_WECHAT_WAP.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxH5PayV3Service); | |||
| serviceMap.put(EnumPayWay.PAY_WAY_TT.getCode()+"_"+EnumPayVersion.DY_PAY_V2.getCode(),ttMiniAppPayService); | |||
| } | |||
| return serviceMap; | |||
| @@ -103,7 +100,7 @@ public class PayServiceFactory { | |||
| if (null == qrcodeMap) { | |||
| qrcodeMap = new ConcurrentHashMap<String,PayAdapterService>(); | |||
| qrcodeMap.put(EnumAppPlat.WX.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxMiniAppPayService); | |||
| qrcodeMap.put(EnumAppPlat.WX.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxMiniAppPayService); | |||
| qrcodeMap.put(EnumAppPlat.WX.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxMiniAppPayService); | |||
| qrcodeMap.put(EnumAppPlat.TOUTIAO.getCode()+"_"+EnumPayVersion.DY_PAY_V2.getCode(),ttMiniAppPayService); | |||
| } | |||
| return qrcodeMap; | |||
| @@ -128,19 +125,19 @@ public class PayServiceFactory { | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_CREDIT.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxShareService); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_GIFTLIST.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxShareService); | |||
| shareMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_POS_NEU.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_MERCHANT.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_VERRIFY.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_B_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_CAR_STOP.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_SYSTEM_SEND.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_BATCH_SEND.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_TRADE.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_PASSWD.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_CREDIT.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_GIFTLIST.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_POS_NEU.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_MERCHANT.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_VERRIFY.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_B_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_CAR_STOP.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_SYSTEM_SEND.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_BATCH_SEND.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_TRADE.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_PASSWD.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_CREDIT.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_GIFTLIST.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||
| } | |||
| return shareMap; | |||
| } | |||
| @@ -150,8 +147,8 @@ public class PayServiceFactory { | |||
| refundMap = new ConcurrentHashMap<String, RefundPayAdapterService>(); | |||
| refundMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxRefundService); | |||
| refundMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxRefundService); | |||
| refundMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxRefundV3AdapterService); | |||
| refundMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxRefundV3AdapterService); | |||
| refundMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxRefundV3AdapterService); | |||
| refundMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxRefundV3AdapterService); | |||
| refundMap.put(EnumPayWay.PAY_WAY_TT.getCode()+"_"+EnumPayVersion.DY_PAY_V2.getCode(), ttRefundService); | |||
| } | |||
| return refundMap; | |||
| @@ -162,8 +159,8 @@ public class PayServiceFactory { | |||
| cashoutMap = new ConcurrentHashMap<String, CashOutAdapterService>(); | |||
| cashoutMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxCashOutService); | |||
| cashoutMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxCashOutService); | |||
| cashoutMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxCashOutV3AdapterService); | |||
| cashoutMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxCashOutV3AdapterService); | |||
| cashoutMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxCashOutV3AdapterService); | |||
| cashoutMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxCashOutV3AdapterService); | |||
| } | |||
| return cashoutMap; | |||
| } | |||
| @@ -1,4 +1,4 @@ | |||
| package com.iformall.service.pay.service.pay.wx.v2; | |||
| package com.iformall.service.pay.service.pay.wx; | |||
| import java.io.File; | |||
| import java.util.Date; | |||
| @@ -51,22 +51,38 @@ import me.chanjar.weixin.open.api.WxOpenService; | |||
| @Slf4j | |||
| public class BaseWxPayAdapterService { | |||
| protected PayQueryAdapterResult queryPayStatus(WxPayOrder oldRecord, WxAppinfo appInfo, WxPayAccount payAccount) | |||
| throws Exception { | |||
| Map<String, String> retMap = WxPayOrderServiceHelper.wxOrderPayStatusMap(oldRecord, appInfo, payAccount); | |||
| int code = WxPayOrderServiceHelper.getPayStatusFromMap(retMap,oldRecord.getPayOrderNo()); | |||
| String msg = WxPayOrderServiceHelper.getPayStatusMsg(retMap, oldRecord.getPayOrderNo()); | |||
| PayQueryAdapterResult result = new PayQueryAdapterResult(code, msg,null, retMap,retMap.get("transaction_id"),retMap.get("time_end")); | |||
| return result; | |||
| } | |||
| protected int queryPayStatus(PayQueryAdapterResult statusObject, String orderOutNo) throws Exception { | |||
| return WxPayOrderServiceHelper.getPayStatusFromMap((Map<String, String>) statusObject.getData(),orderOutNo); | |||
| } | |||
| @Autowired | |||
| WxOpenService openService; | |||
| @Autowired | |||
| MaUtil maUtil; | |||
| protected File getQrCode(WxAppinfo appinfo,String pageUrl,int type,String sceneParam) throws WxErrorException { | |||
| boolean isFmOpen = false; | |||
| WxMaService wxMaService; | |||
| if(isFmOpen) { | |||
| wxMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appinfo.getAppId()); | |||
| } else { | |||
| wxMaService = maUtil.getWeappService(appinfo); | |||
| } | |||
| protected int queryPayStatusCode(WxPayOrder oldRecord, WxAppinfo appInfo, WxPayAccount payAccount) | |||
| throws Exception { | |||
| return WxPayOrderServiceHelper.wxOrderPayStatus(oldRecord, appInfo, payAccount); | |||
| boolean autoColor = false; | |||
| boolean isHyaline = true; | |||
| WxMaCodeLineColor color = new WxMaCodeLineColor("0", "0", "0"); | |||
| String pathStr = ""; | |||
| if (StringUtils.isNotBlank(sceneParam)) { | |||
| pathStr = pageUrl + "?scene="+sceneParam; | |||
| } else { | |||
| pathStr = pageUrl; | |||
| } | |||
| if(type == 0) { | |||
| final File codeFile = wxMaService.getQrcodeService().createQrcode(pathStr, QRCodeUtils.QR_WIDTH); | |||
| return codeFile; | |||
| }else { | |||
| final File codeFile = wxMaService.getQrcodeService().createWxaCodeUnlimit(sceneParam, pageUrl, QRCodeUtils.QR_WIDTH, autoColor, color, isHyaline); | |||
| return codeFile; | |||
| } | |||
| } | |||
| JSONObject errorMapClose = JSON.parseObject("{" + | |||
| @@ -77,85 +93,17 @@ public class BaseWxPayAdapterService { | |||
| "\"REQUIRE_POST_METHOD\":{\"detail\":\"请使用post方法\",\"reason\":\"未使用post传递参数\",\"resolution\":\"请检查请求参数是否通过post方法提交\"}," + | |||
| "\"XML_FORMAT_ERROR\":{\"detail\":\"XML格式错误\t\",\"reason\":\"XML格式错误\",\"reason\":\"请检查XML参数格式是否正确\"}}"); | |||
| protected PayAdapterResult closeOrder(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) { | |||
| String response = closeOrderWx(appInfo, record,payAccount); | |||
| log.info("pay order close, " + record.toString() + ", response: " + response); | |||
| Map<String, String> returnMap = WxPayment.xmlToMap(response); | |||
| String return_code = returnMap.get("return_code"); | |||
| String result_code = returnMap.get("result_code"); | |||
| if ("SUCCESS".equalsIgnoreCase(return_code)) { | |||
| if ("SUCCESS".equals(result_code)) { | |||
| return new PayAdapterResult(true, "success", returnMap, null); | |||
| } else { | |||
| String errMsg = ""; | |||
| JSONObject errObj = errorMapClose.getJSONObject(result_code); | |||
| if (errObj != null) { | |||
| errMsg = errObj.toJSONString(); | |||
| } else { | |||
| errMsg = returnMap.get("return_msg"); | |||
| } | |||
| return new PayAdapterResult(false, errMsg, returnMap, null); | |||
| } | |||
| } else { | |||
| String errMsg = returnMap.get("return_msg"); | |||
| return new PayAdapterResult(false, errMsg, returnMap, null); | |||
| } | |||
| } | |||
| private String closeOrderWx(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) { | |||
| // get payAccount | |||
| if (payAccount.getType() == EnumPayMode.MCH.getCode()) { | |||
| // 普通商户号模式 | |||
| WxPayOrderQ payOrderC = new WxPayOrderQ(); | |||
| String noncestr = Utility.generate32UUID(); | |||
| payOrderC.setAppid(appInfo.getAppId()); | |||
| payOrderC.setMch_id(payAccount.getMchId()); | |||
| payOrderC.setNonce_str(noncestr); | |||
| payOrderC.setOut_trade_no(record.getPayOrderNo()); | |||
| try { | |||
| Map map = BeanUtils.toStringMap(payOrderC); | |||
| payOrderC.setSign(WxPayment.createSign(map, payAccount.getApiKey())); | |||
| map = BeanUtils.toStringMap(payOrderC); | |||
| String response = WxPay.closeOrder(map); | |||
| log.info("request:" + map.toString() + "\nresponse:" + response); | |||
| return response; | |||
| } catch (RuntimeException e) { | |||
| throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); | |||
| } catch (Exception e) { | |||
| throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); | |||
| } | |||
| } else { | |||
| // 服务商模式 | |||
| WxPayOrderSQ payOrderSC = new WxPayOrderSQ(); | |||
| String noncestr = Utility.generate32UUID(); | |||
| payOrderSC.setAppid(appInfo.getParentAppId()); | |||
| payOrderSC.setSub_appid(appInfo.getAppId()); | |||
| payOrderSC.setMch_id(payAccount.getMchId()); | |||
| payOrderSC.setSub_mch_id(payAccount.getSubMchId()); | |||
| payOrderSC.setNonce_str(noncestr); | |||
| payOrderSC.setOut_trade_no(record.getPayOrderNo()); | |||
| payOrderSC.setSign_type("HMAC-SHA256"); | |||
| try { | |||
| Map map = BeanUtils.toStringMap(payOrderSC); | |||
| payOrderSC.setSign(WxPayment.createSignHMAC(map, payAccount.getApiKey())); | |||
| map = BeanUtils.toStringMap(payOrderSC); | |||
| String response = WxPay.closeOrder(map); | |||
| log.info("request:" + map.toString() + "\nresponse:" + response); | |||
| return response; | |||
| } catch (RuntimeException e) { | |||
| throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); | |||
| } catch (Exception e) { | |||
| throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 收款码支付回撤,都是2.0版本 | |||
| * @param appInfo | |||
| * @param record | |||
| * @param payAccount | |||
| * @return | |||
| * @throws Exception | |||
| */ | |||
| protected PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) throws Exception { | |||
| String response = payOrderReverseWx(appInfo, record,payAccount); | |||
| protected PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount,String subMchId) throws Exception { | |||
| String response = payOrderReverseWx(appInfo, record,payAccount,subMchId); | |||
| log.info("pay order reverse, " + record.toString() + ", response: " + response); | |||
| Map<String, String> returnMap = WxPayment.xmlToMap(response); | |||
| String return_code = returnMap.get("return_code"); | |||
| @@ -179,7 +127,7 @@ public class BaseWxPayAdapterService { | |||
| } | |||
| } | |||
| private String payOrderReverseWx(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) { | |||
| private String payOrderReverseWx(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount,String subMchId) { | |||
| // get payAccount | |||
| if (payAccount.getType() == EnumPayMode.MCH.getCode()) { | |||
| // 普通商户号模式 | |||
| @@ -209,7 +157,7 @@ public class BaseWxPayAdapterService { | |||
| payOrderSC.setAppid(appInfo.getParentAppId()); | |||
| payOrderSC.setSub_appid(appInfo.getAppId()); | |||
| payOrderSC.setMch_id(payAccount.getMchId()); | |||
| payOrderSC.setSub_mch_id(payAccount.getSubMchId()); | |||
| payOrderSC.setSub_mch_id(subMchId); | |||
| payOrderSC.setNonce_str(noncestr); | |||
| payOrderSC.setOut_trade_no(record.getPayOrderNo()); | |||
| payOrderSC.setSign_type("HMAC-SHA256"); | |||
| @@ -228,39 +176,4 @@ public class BaseWxPayAdapterService { | |||
| } | |||
| } | |||
| } | |||
| @Autowired | |||
| WxOpenService openService; | |||
| @Autowired | |||
| MaUtil maUtil; | |||
| protected File getQrCode(WxAppinfo appinfo,String pageUrl,int type,String sceneParam) throws WxErrorException { | |||
| boolean isFmOpen = false; | |||
| WxMaService wxMaService; | |||
| if(isFmOpen) { | |||
| wxMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appinfo.getAppId()); | |||
| } else { | |||
| wxMaService = maUtil.getWeappService(appinfo); | |||
| } | |||
| boolean autoColor = false; | |||
| boolean isHyaline = true; | |||
| WxMaCodeLineColor color = new WxMaCodeLineColor("0", "0", "0"); | |||
| String pathStr = ""; | |||
| if (StringUtils.isNotBlank(sceneParam)) { | |||
| pathStr = pageUrl + "?scene="+sceneParam; | |||
| } else { | |||
| pathStr = pageUrl; | |||
| } | |||
| if(type == 0) { | |||
| final File codeFile = wxMaService.getQrcodeService().createQrcode(pathStr, QRCodeUtils.QR_WIDTH); | |||
| return codeFile; | |||
| }else { | |||
| final File codeFile = wxMaService.getQrcodeService().createWxaCodeUnlimit(sceneParam, pageUrl, QRCodeUtils.QR_WIDTH, autoColor, color, isHyaline); | |||
| return codeFile; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,56 @@ | |||
| package com.iformall.service.pay.service.pay.wx.sft; | |||
| import java.io.File; | |||
| import java.util.Date; | |||
| import java.util.Map; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import com.alibaba.fastjson.JSON; | |||
| import com.alibaba.fastjson.JSONObject; | |||
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | |||
| import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; | |||
| import com.iformall.common.ErrorCode; | |||
| import com.iformall.common.Result; | |||
| import com.iformall.common.ResultData; | |||
| import com.iformall.domain.po.PosCouponOrderVerify; | |||
| import com.iformall.domain.po.WxAppinfo; | |||
| import com.iformall.domain.po.WxBatchOrder; | |||
| import com.iformall.domain.po.WxCouponOrder; | |||
| import com.iformall.domain.po.WxOrder; | |||
| import com.iformall.domain.po.WxPayAccount; | |||
| import com.iformall.domain.po.WxPayOrder; | |||
| import com.iformall.enums.EnumCouponOrderStatus; | |||
| import com.iformall.enums.EnumOrderFrom; | |||
| import com.iformall.enums.EnumOrderStatus; | |||
| import com.iformall.enums.EnumOrderType; | |||
| import com.iformall.enums.EnumPayMode; | |||
| import com.iformall.enums.EnumPayStatus; | |||
| import com.iformall.exception.MallinkException; | |||
| import com.iformall.pay.WxPay; | |||
| import com.iformall.pay.WxPayOrderQ; | |||
| import com.iformall.pay.WxPayOrderSQ; | |||
| import com.iformall.pay.WxPayment; | |||
| import com.iformall.service.QrCodeService; | |||
| import com.iformall.service.helper.WxPayOrderServiceHelper; | |||
| import com.iformall.service.pay.service.pay.PayAdapterService; | |||
| import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | |||
| import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | |||
| import com.iformall.service.pay.service.pay.wx.BaseWxPayAdapterService; | |||
| import com.iformall.utils.BeanUtils; | |||
| import com.iformall.utils.MaUtil; | |||
| import com.iformall.utils.QRCodeUtils; | |||
| import com.iformall.utils.Utility; | |||
| import cn.binarywang.wx.miniapp.api.WxMaService; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaCodeLineColor; | |||
| import lombok.extern.slf4j.Slf4j; | |||
| import me.chanjar.weixin.common.error.WxErrorException; | |||
| import me.chanjar.weixin.open.api.WxOpenService; | |||
| @Slf4j | |||
| public class BaseWxPaySFTAdapterService extends BaseWxPayAdapterService{ | |||
| } | |||
| @@ -1,9 +1,9 @@ | |||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||
| import lombok.Data; | |||
| @Data | |||
| public class CombineCloseItemOrder { | |||
| public class SFTCombineCloseItemOrder { | |||
| private String mchid;//子单发起方商户号,必须与发起方appid有绑定关系 | |||
| private String out_trade_no;//子单商户订单号 | |||
| @@ -1,4 +1,4 @@ | |||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| @@ -9,21 +9,21 @@ import com.iformall.service.order.entity.WxComposeChildOrderShare; | |||
| import lombok.Data; | |||
| @Data | |||
| public class CombineCloseReq { | |||
| public class SFTCombineCloseReq { | |||
| private String combine_appid;//合单发起方的appid | |||
| @JSONField(serialize = false) | |||
| private String combine_out_trade_no;//不放到body | |||
| private List<CombineCloseItemOrder> sub_orders; | |||
| private List<SFTCombineCloseItemOrder> sub_orders; | |||
| public void initSubOrders(WxPayAccount payAccount,WxPayOrder payOrder) { | |||
| List<WxComposeChildOrderShare> childs = payOrder.getAllChilds(); | |||
| if (null != childs) { | |||
| List<CombineCloseItemOrder> suborders = new ArrayList<CombineCloseItemOrder>(); | |||
| List<SFTCombineCloseItemOrder> suborders = new ArrayList<SFTCombineCloseItemOrder>(); | |||
| for (WxComposeChildOrderShare child : childs) { | |||
| CombineCloseItemOrder ccio = new CombineCloseItemOrder(); | |||
| SFTCombineCloseItemOrder ccio = new SFTCombineCloseItemOrder(); | |||
| ccio.setMchid(payAccount.getMchId()); | |||
| ccio.setSub_mchid(child.getMerchantUid()); | |||
| ccio.setOut_trade_no(String.valueOf(child.getOrderId())); | |||
| @@ -1,4 +1,4 @@ | |||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||
| import com.iformall.domain.po.WxAppinfo; | |||
| import com.iformall.domain.po.WxOrder; | |||
| @@ -7,26 +7,26 @@ import com.iformall.domain.po.WxPayAccount; | |||
| import lombok.Data; | |||
| @Data | |||
| public class CombineItemOrder { | |||
| public class SFTCombineItemOrder { | |||
| private String mchid;//子单发起方商户号,必须与发起方appid有绑定关系 | |||
| private String attach;//附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用 | |||
| private CombinePayAmountReq amount;//订单金额 | |||
| private SFTCombinePayAmountReq amount;//订单金额 | |||
| private String out_trade_no;//子单商户订单号 | |||
| private String sub_mchid;//二级商户号,服务商子商户的商户号,被合单方。直连商户不用传二级商户号 | |||
| private String description;//商品描述,需传入应用市场上的APP名字-实际商品名称 | |||
| private PaySettleReq settle_info;//结算信息 | |||
| private SFTPaySettleReq settle_info;//结算信息 | |||
| public void initByWxOrder(WxPayAccount payAccount,WxOrder order,String subMchId,WxAppinfo appInfo,String productName,String extParam) { | |||
| this.mchid = payAccount.getMchId(); | |||
| this.attach = extParam; | |||
| CombinePayAmountReq amount = new CombinePayAmountReq(); | |||
| SFTCombinePayAmountReq amount = new SFTCombinePayAmountReq(); | |||
| amount.setTotal_amount(order.getPayment()); | |||
| this.setAmount(amount); | |||
| this.out_trade_no = String.valueOf(order.getId()); | |||
| this.sub_mchid = subMchId; | |||
| this.description = appInfo.getName()+"-"+productName; | |||
| PaySettleReq settle = new PaySettleReq(); | |||
| SFTPaySettleReq settle = new SFTPaySettleReq(); | |||
| settle.setProfit_sharing(true); | |||
| this.setSettle_info(settle); | |||
| } | |||
| @@ -1,9 +1,9 @@ | |||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||
| import lombok.Data; | |||
| @Data | |||
| public class CombinePayAmountReq { | |||
| public class SFTCombinePayAmountReq { | |||
| private int total_amount;//总金额,单位为分。 | |||
| private String currency="CNY";//货币类型 | |||
| @@ -1,16 +1,16 @@ | |||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||
| import java.util.List; | |||
| import lombok.Data; | |||
| @Data | |||
| public class CombinePayCommonMiniAppReq { | |||
| public class SFTCombinePayCommonMiniAppReq { | |||
| private String combine_appid;//合单发起方的appid | |||
| private String combine_mchid;//合单发起方商户号,服务商和电商模式下,传服务商商户号 | |||
| private String combine_out_trade_no;//合单支付总订单号 | |||
| private List<CombineItemOrder> sub_orders;//商品描述 | |||
| private CombinePayerReq combine_payer_info;// 支付者信息 | |||
| private List<SFTCombineItemOrder> sub_orders;//商品描述 | |||
| private SFTCombinePayerReq combine_payer_info;// 支付者信息 | |||
| private String notify_url;//接收微信支付异步通知回调地址 | |||
| } | |||
| @@ -1,9 +1,9 @@ | |||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||
| import lombok.Data; | |||
| @Data | |||
| public class CombinePayerReq { | |||
| public class SFTCombinePayerReq { | |||
| private String openid;//使用合单appid获取的对应用户openid | |||
| @@ -1,9 +1,9 @@ | |||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||
| import lombok.Data; | |||
| @Data | |||
| public class PayAmountReq { | |||
| public class SFTPayAmountReq { | |||
| private int total;//总金额,单位为分。 | |||
| private String currency="CNY";//货币类型 | |||
| @@ -1,9 +1,9 @@ | |||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||
| import lombok.Data; | |||
| @Data | |||
| public class PayCommonMiniAppReq { | |||
| public class SFTPayCommonMiniAppReq { | |||
| private String sp_appid;//服务商应用ID | |||
| private String sp_mchid;//服务商户号 | |||
| @@ -11,7 +11,7 @@ public class PayCommonMiniAppReq { | |||
| private String description;//商品描述 | |||
| private String out_trade_no;//商户订单号 | |||
| private String notify_url;//通知地址,不允许携带查询串 | |||
| private PaySettleReq settle_info;//结算信息 | |||
| private PayAmountReq amount;//订单金额 | |||
| private PayerReq payer;//支付者 | |||
| private SFTPaySettleReq settle_info;//结算信息 | |||
| private SFTPayAmountReq amount;//订单金额 | |||
| private SFTPayerReq payer;//支付者 | |||
| } | |||
| @@ -1,11 +1,11 @@ | |||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||
| import com.alibaba.fastjson.annotation.JSONField; | |||
| import lombok.Data; | |||
| @Data | |||
| public class PayQueryReq { | |||
| public class SFTPayQueryReq { | |||
| private String sp_mchid;//服务商户号。 | |||
| private String sub_mchid;//二级商户号 | |||
| @@ -1,9 +1,9 @@ | |||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||
| import lombok.Data; | |||
| @Data | |||
| public class PaySettleReq { | |||
| public class SFTPaySettleReq { | |||
| private boolean profit_sharing;//是否指定分账 | |||
| private int subsidy_amount = 0;//补差金额,单笔订单最高补差金额为5000元.SettleInfo.profit_sharing为true时,该金额才生效 | |||
| @@ -1,9 +1,9 @@ | |||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||
| import lombok.Data; | |||
| @Data | |||
| public class PayerReq { | |||
| public class SFTPayerReq { | |||
| private String sp_openid;//用户在服务商appid下的唯一标识 | |||
| @@ -1,4 +1,4 @@ | |||
| package com.iformall.service.pay.service.pay.wx.v3.h5; | |||
| package com.iformall.service.pay.service.pay.wx.sft.h5; | |||
| import java.io.File; | |||
| import java.util.Date; | |||
| @@ -16,10 +16,11 @@ import com.iformall.service.pay.entity.PayExtraParam; | |||
| import com.iformall.service.pay.service.pay.CDrivingPayService; | |||
| import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | |||
| import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | |||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayAdapterService; | |||
| import com.iformall.service.pay.service.pay.wx.sft.BaseWxPaySFTAdapterService; | |||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayV2AdapterService; | |||
| @Service | |||
| public class WxH5PayV3Service implements CDrivingPayService{ | |||
| public class WxH5PaySFTService extends BaseWxPaySFTAdapterService implements CDrivingPayService{ | |||
| @Override | |||
| public PayAdapterResult pay(WxPayAccount payAccount,WxPayOrder record,WxComposeOrder composeOrder,List<WxOrder> childOrders, | |||
| @@ -1,4 +1,4 @@ | |||
| package com.iformall.service.pay.service.pay.wx.v3.miniApp.appPay; | |||
| package com.iformall.service.pay.service.pay.wx.sft.miniApp.appPay; | |||
| import java.io.File; | |||
| import java.util.ArrayList; | |||
| @@ -37,16 +37,18 @@ import com.iformall.service.pay.entity.PayExtraParam; | |||
| import com.iformall.service.pay.service.pay.CDrivingPayService; | |||
| import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | |||
| import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | |||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayAdapterService; | |||
| import com.iformall.service.pay.service.pay.wx.v3.entity.CombineCloseReq; | |||
| import com.iformall.service.pay.service.pay.wx.v3.entity.CombineItemOrder; | |||
| import com.iformall.service.pay.service.pay.wx.v3.entity.CombinePayCommonMiniAppReq; | |||
| import com.iformall.service.pay.service.pay.wx.v3.entity.CombinePayerReq; | |||
| import com.iformall.service.pay.service.pay.wx.v3.entity.PayAmountReq; | |||
| import com.iformall.service.pay.service.pay.wx.v3.entity.PayCommonMiniAppReq; | |||
| import com.iformall.service.pay.service.pay.wx.v3.entity.PayQueryReq; | |||
| import com.iformall.service.pay.service.pay.wx.v3.entity.PaySettleReq; | |||
| import com.iformall.service.pay.service.pay.wx.v3.entity.PayerReq; | |||
| import com.iformall.service.pay.service.pay.wx.BaseWxPayAdapterService; | |||
| import com.iformall.service.pay.service.pay.wx.sft.BaseWxPaySFTAdapterService; | |||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTCombineCloseReq; | |||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTCombineItemOrder; | |||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTCombinePayCommonMiniAppReq; | |||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTCombinePayerReq; | |||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTPayAmountReq; | |||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTPayCommonMiniAppReq; | |||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTPayQueryReq; | |||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTPaySettleReq; | |||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTPayerReq; | |||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayV2AdapterService; | |||
| import com.iformall.utils.BeanUtils; | |||
| import com.iformall.utils.MaUtil; | |||
| import com.iformall.utils.MapUtil; | |||
| @@ -56,13 +58,13 @@ import lombok.extern.slf4j.Slf4j; | |||
| @Slf4j | |||
| @Service | |||
| public class WxMiniAppPayV3AdapterService implements CDrivingPayService{ | |||
| public class WxMiniAppPaySFTAdapterService extends BaseWxPaySFTAdapterService implements CDrivingPayService{ | |||
| @Autowired | |||
| MaUtil maUtil; | |||
| private PayCommonMiniAppReq generatePayCommonRequest(WxPayAccount payAccount,WxComposeOrder composeOrder,String productName, WxPayOrder record,String openId,WxAppinfo appInfo,Date currentDate) throws Exception { | |||
| PayCommonMiniAppReq req = new PayCommonMiniAppReq(); | |||
| private SFTPayCommonMiniAppReq generatePayCommonRequest(WxPayAccount payAccount,WxComposeOrder composeOrder,String productName, WxPayOrder record,String openId,WxAppinfo appInfo,Date currentDate) throws Exception { | |||
| SFTPayCommonMiniAppReq req = new SFTPayCommonMiniAppReq(); | |||
| req.setSp_appid(String.valueOf(appInfo.getId())); | |||
| req.setSp_mchid(payAccount.getMchId()); | |||
| req.setSub_mchid(getMerchantUid(record,composeOrder.getSingleOrder())); | |||
| @@ -70,15 +72,15 @@ public class WxMiniAppPayV3AdapterService implements CDrivingPayService{ | |||
| req.setOut_trade_no(String.valueOf(composeOrder.getMainOrderId())); | |||
| req.setNotify_url(payAccount.getPayNotifyV3Url()); | |||
| PaySettleReq settle = new PaySettleReq(); | |||
| SFTPaySettleReq settle = new SFTPaySettleReq(); | |||
| settle.setProfit_sharing(true); | |||
| req.setSettle_info(settle); | |||
| PayAmountReq amout = new PayAmountReq(); | |||
| SFTPayAmountReq amout = new SFTPayAmountReq(); | |||
| amout.setTotal(record.getPayAmount()); | |||
| req.setAmount(amout); | |||
| PayerReq payer = new PayerReq(); | |||
| SFTPayerReq payer = new SFTPayerReq(); | |||
| payer.setSp_openid(openId); | |||
| req.setPayer(payer); | |||
| @@ -90,24 +92,24 @@ public class WxMiniAppPayV3AdapterService implements CDrivingPayService{ | |||
| return share.getMerchantUid(); | |||
| } | |||
| private CombinePayCommonMiniAppReq generateCombinePayReqeust(WxPayAccount payAccount,WxComposeOrder composeOrder,List<WxOrder> childOrders,String productName, | |||
| private SFTCombinePayCommonMiniAppReq generateCombinePayReqeust(WxPayAccount payAccount,WxComposeOrder composeOrder,List<WxOrder> childOrders,String productName, | |||
| WxPayOrder record,WxAppinfo appInfo,String openId,String appId,Date currentDate,EnumPayShare isShare) throws Exception { | |||
| CombinePayCommonMiniAppReq req = new CombinePayCommonMiniAppReq(); | |||
| SFTCombinePayCommonMiniAppReq req = new SFTCombinePayCommonMiniAppReq(); | |||
| req.setCombine_appid(appInfo.getAppId()); | |||
| req.setCombine_mchid(payAccount.getMchId()); | |||
| req.setCombine_out_trade_no(String.valueOf(composeOrder.getMainOrderId())); | |||
| List<CombineItemOrder> suborders = new ArrayList<CombineItemOrder>(); | |||
| List<SFTCombineItemOrder> suborders = new ArrayList<SFTCombineItemOrder>(); | |||
| for (WxOrder order : childOrders) { | |||
| CombineItemOrder so = new CombineItemOrder(); | |||
| SFTCombineItemOrder so = new SFTCombineItemOrder(); | |||
| String subMchId = getMerchantUid(record,order); | |||
| so.initByWxOrder(payAccount, order, subMchId, appInfo, productName, String.valueOf(record.getId())); | |||
| suborders.add(so); | |||
| } | |||
| req.setSub_orders(suborders); | |||
| CombinePayerReq payer = new CombinePayerReq(); | |||
| SFTCombinePayerReq payer = new SFTCombinePayerReq(); | |||
| payer.setOpenid(openId); | |||
| req.setCombine_payer_info(payer); | |||
| @@ -168,7 +170,7 @@ public class WxMiniAppPayV3AdapterService implements CDrivingPayService{ | |||
| * https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_3.shtml | |||
| */ | |||
| if (childOrders.size() == 1) { | |||
| PayCommonMiniAppReq payReq = generatePayCommonRequest(payAccount,composeOrder,productName,record,openId,appInfo,currentDate); | |||
| SFTPayCommonMiniAppReq payReq = generatePayCommonRequest(payAccount,composeOrder,productName,record,openId,appInfo,currentDate); | |||
| String response = WxPayV3.payCommonWithMiniApp(payService, payReq); | |||
| log.info("pay order v3, " + payReq.toString() + ", response: " + response.toString()); | |||
| return getOrderPResult(response); | |||
| @@ -221,7 +223,7 @@ public class WxMiniAppPayV3AdapterService implements CDrivingPayService{ | |||
| public PayQueryAdapterResult queryPayStatus(WxPayOrder oldRecord, WxAppinfo appInfo, | |||
| WxPayAccount payAccount) throws Exception { | |||
| WxPayService payService = maUtil.getWxPayService(appInfo, payAccount); | |||
| PayQueryReq req = new PayQueryReq(); | |||
| SFTPayQueryReq req = new SFTPayQueryReq(); | |||
| if (!oldRecord.isMulity()) { | |||
| req.setSp_mchid(payAccount.getMchId()); | |||
| req.setSub_mchid(oldRecord.getSingleChildOrderShare().getMerchantUid()); | |||
| @@ -259,7 +261,7 @@ public class WxMiniAppPayV3AdapterService implements CDrivingPayService{ | |||
| public PayAdapterResult payOrderClose(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) throws Exception { | |||
| WxPayService payService = maUtil.getWxPayService(appInfo, payAccount); | |||
| if (!record.isMulity()) { | |||
| PayQueryReq req = new PayQueryReq(); | |||
| SFTPayQueryReq req = new SFTPayQueryReq(); | |||
| req.setSp_mchid(payAccount.getMchId()); | |||
| req.setSub_mchid(record.getSingleChildOrderShare().getMerchantUid()); | |||
| req.setOut_trade_no(String.valueOf(record.getId())); | |||
| @@ -281,19 +283,17 @@ public class WxMiniAppPayV3AdapterService implements CDrivingPayService{ | |||
| @Override | |||
| public PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record, WxPayAccount payAccount) | |||
| throws Exception { | |||
| //return super.payOrderReverse(appInfo, record, payAccount); | |||
| return null; | |||
| return super.payOrderReverse(appInfo, record, payAccount, payAccount.getSubMchId()); | |||
| } | |||
| @Override | |||
| public PayAdapterResult payOrderPush(String openId,WxAppinfo appInfo, WxBatchOrder batchOrder,WxPayOrder payOrder) throws Exception { | |||
| return null; | |||
| throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR); | |||
| } | |||
| @Override | |||
| public File getQrcode(WxAppinfo appinfo,String pageUrl,int type,String sceneParam) throws Exception{ | |||
| //return super.getQrCode(appinfo, pageUrl, type, sceneParam); | |||
| return null; | |||
| return super.getQrCode(appinfo, pageUrl, type, sceneParam); | |||
| } | |||
| @Override | |||
| @@ -0,0 +1,159 @@ | |||
| package com.iformall.service.pay.service.pay.wx.v2; | |||
| import java.io.File; | |||
| import java.util.Date; | |||
| import java.util.Map; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import com.alibaba.fastjson.JSON; | |||
| import com.alibaba.fastjson.JSONObject; | |||
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | |||
| import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; | |||
| import com.iformall.common.ErrorCode; | |||
| import com.iformall.common.Result; | |||
| import com.iformall.common.ResultData; | |||
| import com.iformall.domain.po.PosCouponOrderVerify; | |||
| import com.iformall.domain.po.WxAppinfo; | |||
| import com.iformall.domain.po.WxBatchOrder; | |||
| import com.iformall.domain.po.WxCouponOrder; | |||
| import com.iformall.domain.po.WxOrder; | |||
| import com.iformall.domain.po.WxPayAccount; | |||
| import com.iformall.domain.po.WxPayOrder; | |||
| import com.iformall.enums.EnumCouponOrderStatus; | |||
| import com.iformall.enums.EnumOrderFrom; | |||
| import com.iformall.enums.EnumOrderStatus; | |||
| import com.iformall.enums.EnumOrderType; | |||
| import com.iformall.enums.EnumPayMode; | |||
| import com.iformall.enums.EnumPayStatus; | |||
| import com.iformall.exception.MallinkException; | |||
| import com.iformall.pay.WxPay; | |||
| import com.iformall.pay.WxPayOrderQ; | |||
| import com.iformall.pay.WxPayOrderSQ; | |||
| import com.iformall.pay.WxPayment; | |||
| import com.iformall.service.QrCodeService; | |||
| import com.iformall.service.helper.WxPayOrderServiceHelper; | |||
| import com.iformall.service.pay.service.pay.PayAdapterService; | |||
| import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | |||
| import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | |||
| import com.iformall.service.pay.service.pay.wx.BaseWxPayAdapterService; | |||
| import com.iformall.utils.BeanUtils; | |||
| import com.iformall.utils.MaUtil; | |||
| import com.iformall.utils.QRCodeUtils; | |||
| import com.iformall.utils.Utility; | |||
| import cn.binarywang.wx.miniapp.api.WxMaService; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaCodeLineColor; | |||
| import lombok.extern.slf4j.Slf4j; | |||
| import me.chanjar.weixin.common.error.WxErrorException; | |||
| import me.chanjar.weixin.open.api.WxOpenService; | |||
| @Slf4j | |||
| public class BaseWxPayV2AdapterService extends BaseWxPayAdapterService{ | |||
| protected PayQueryAdapterResult queryPayStatus(WxPayOrder oldRecord, WxAppinfo appInfo, WxPayAccount payAccount) | |||
| throws Exception { | |||
| Map<String, String> retMap = WxPayOrderServiceHelper.wxOrderPayStatusMap(oldRecord, appInfo, payAccount); | |||
| int code = WxPayOrderServiceHelper.getPayStatusFromMap(retMap,oldRecord.getPayOrderNo()); | |||
| String msg = WxPayOrderServiceHelper.getPayStatusMsg(retMap, oldRecord.getPayOrderNo()); | |||
| PayQueryAdapterResult result = new PayQueryAdapterResult(code, msg,null, retMap,retMap.get("transaction_id"),retMap.get("time_end")); | |||
| return result; | |||
| } | |||
| protected int queryPayStatus(PayQueryAdapterResult statusObject, String orderOutNo) throws Exception { | |||
| return WxPayOrderServiceHelper.getPayStatusFromMap((Map<String, String>) statusObject.getData(),orderOutNo); | |||
| } | |||
| protected int queryPayStatusCode(WxPayOrder oldRecord, WxAppinfo appInfo, WxPayAccount payAccount) | |||
| throws Exception { | |||
| return WxPayOrderServiceHelper.wxOrderPayStatus(oldRecord, appInfo, payAccount); | |||
| } | |||
| JSONObject errorMapClose = JSON.parseObject("{" + | |||
| "\"ORDERPAID\":{\"detail\":\"订单已支付\",\"reason\":\"订单已支付,不能发起关单\",\"resolution\":\"订单已支付,不能发起关单,请当作已支付的正常交易\"}," + | |||
| "\"SYSTEMERROR\":{\"detail\":\"系统错误\",\"reason\":\"系统错误\",\"resolution\":\"系统异常,请重新调用该API\"}," + | |||
| "\"ORDERCLOSED\":{\"detail\":\"订单已关闭\",\"reason\":\"订单已关闭,无法重复关闭\",\"resolution\":\"订单已关闭,无需继续调用\"}," + | |||
| "\"SIGNERROR\":{\"detail\":\"签名错误\",\"reason\":\"参数签名结果不正确\",\"resolution\":\"请检查签名参数和方法是否都符合签名算法要求\"}," + | |||
| "\"REQUIRE_POST_METHOD\":{\"detail\":\"请使用post方法\",\"reason\":\"未使用post传递参数\",\"resolution\":\"请检查请求参数是否通过post方法提交\"}," + | |||
| "\"XML_FORMAT_ERROR\":{\"detail\":\"XML格式错误\t\",\"reason\":\"XML格式错误\",\"reason\":\"请检查XML参数格式是否正确\"}}"); | |||
| protected PayAdapterResult closeOrder(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) { | |||
| String response = closeOrderWx(appInfo, record,payAccount); | |||
| log.info("pay order close, " + record.toString() + ", response: " + response); | |||
| Map<String, String> returnMap = WxPayment.xmlToMap(response); | |||
| String return_code = returnMap.get("return_code"); | |||
| String result_code = returnMap.get("result_code"); | |||
| if ("SUCCESS".equalsIgnoreCase(return_code)) { | |||
| if ("SUCCESS".equals(result_code)) { | |||
| return new PayAdapterResult(true, "success", returnMap, null); | |||
| } else { | |||
| String errMsg = ""; | |||
| JSONObject errObj = errorMapClose.getJSONObject(result_code); | |||
| if (errObj != null) { | |||
| errMsg = errObj.toJSONString(); | |||
| } else { | |||
| errMsg = returnMap.get("return_msg"); | |||
| } | |||
| return new PayAdapterResult(false, errMsg, returnMap, null); | |||
| } | |||
| } else { | |||
| String errMsg = returnMap.get("return_msg"); | |||
| return new PayAdapterResult(false, errMsg, returnMap, null); | |||
| } | |||
| } | |||
| private String closeOrderWx(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) { | |||
| // get payAccount | |||
| if (payAccount.getType() == EnumPayMode.MCH.getCode()) { | |||
| // 普通商户号模式 | |||
| WxPayOrderQ payOrderC = new WxPayOrderQ(); | |||
| String noncestr = Utility.generate32UUID(); | |||
| payOrderC.setAppid(appInfo.getAppId()); | |||
| payOrderC.setMch_id(payAccount.getMchId()); | |||
| payOrderC.setNonce_str(noncestr); | |||
| payOrderC.setOut_trade_no(record.getPayOrderNo()); | |||
| try { | |||
| Map map = BeanUtils.toStringMap(payOrderC); | |||
| payOrderC.setSign(WxPayment.createSign(map, payAccount.getApiKey())); | |||
| map = BeanUtils.toStringMap(payOrderC); | |||
| String response = WxPay.closeOrder(map); | |||
| log.info("request:" + map.toString() + "\nresponse:" + response); | |||
| return response; | |||
| } catch (RuntimeException e) { | |||
| throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); | |||
| } catch (Exception e) { | |||
| throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); | |||
| } | |||
| } else { | |||
| // 服务商模式 | |||
| WxPayOrderSQ payOrderSC = new WxPayOrderSQ(); | |||
| String noncestr = Utility.generate32UUID(); | |||
| payOrderSC.setAppid(appInfo.getParentAppId()); | |||
| payOrderSC.setSub_appid(appInfo.getAppId()); | |||
| payOrderSC.setMch_id(payAccount.getMchId()); | |||
| payOrderSC.setSub_mch_id(payAccount.getSubMchId()); | |||
| payOrderSC.setNonce_str(noncestr); | |||
| payOrderSC.setOut_trade_no(record.getPayOrderNo()); | |||
| payOrderSC.setSign_type("HMAC-SHA256"); | |||
| try { | |||
| Map map = BeanUtils.toStringMap(payOrderSC); | |||
| payOrderSC.setSign(WxPayment.createSignHMAC(map, payAccount.getApiKey())); | |||
| map = BeanUtils.toStringMap(payOrderSC); | |||
| String response = WxPay.closeOrder(map); | |||
| log.info("request:" + map.toString() + "\nresponse:" + response); | |||
| return response; | |||
| } catch (RuntimeException e) { | |||
| throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); | |||
| } catch (Exception e) { | |||
| throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -16,10 +16,10 @@ import com.iformall.service.pay.entity.PayExtraParam; | |||
| import com.iformall.service.pay.service.pay.CDrivingPayService; | |||
| import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | |||
| import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | |||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayAdapterService; | |||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayV2AdapterService; | |||
| @Service | |||
| public class WxH5PayService extends BaseWxPayAdapterService implements CDrivingPayService{ | |||
| public class WxH5PayService extends BaseWxPayV2AdapterService implements CDrivingPayService{ | |||
| @Override | |||
| public PayAdapterResult pay(WxPayAccount payAccount,WxPayOrder record,WxComposeOrder composeOrder,List<WxOrder> childOrders, | |||
| @@ -29,7 +29,7 @@ import com.iformall.service.pay.entity.PayExtraParam; | |||
| import com.iformall.service.pay.service.pay.CDrivingPayService; | |||
| import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | |||
| import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | |||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayAdapterService; | |||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayV2AdapterService; | |||
| import com.iformall.utils.BeanUtils; | |||
| import com.iformall.utils.MapUtil; | |||
| import com.iformall.utils.Utility; | |||
| @@ -38,7 +38,7 @@ import lombok.extern.slf4j.Slf4j; | |||
| @Slf4j | |||
| @Service | |||
| public class WxMiniAppPayAdapterService extends BaseWxPayAdapterService implements CDrivingPayService{ | |||
| public class WxMiniAppPayAdapterService extends BaseWxPayV2AdapterService implements CDrivingPayService{ | |||
| JSONObject errorMap = JSON.parseObject("{" + | |||
| @@ -270,7 +270,7 @@ public class WxMiniAppPayAdapterService extends BaseWxPayAdapterService implemen | |||
| @Override | |||
| public PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record, WxPayAccount payAccount) | |||
| throws Exception { | |||
| return super.payOrderReverse(appInfo, record, payAccount); | |||
| return super.payOrderReverse(appInfo, record, payAccount,payAccount.getSubMchId()); | |||
| } | |||
| @Override | |||
| @@ -32,7 +32,7 @@ import com.iformall.service.pay.service.pay.CPassivePayService; | |||
| import com.iformall.service.pay.service.pay.entity.CreateUser; | |||
| import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | |||
| import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | |||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayAdapterService; | |||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayV2AdapterService; | |||
| import com.iformall.utils.BeanUtils; | |||
| import com.iformall.utils.Utility; | |||
| import lombok.extern.slf4j.Slf4j; | |||
| @@ -41,7 +41,7 @@ import me.chanjar.weixin.common.error.WxErrorException; | |||
| @Slf4j | |||
| @Service | |||
| public class WxMiniMaPayAdapterService extends BaseWxPayAdapterService implements CPassivePayService{ | |||
| public class WxMiniMaPayAdapterService extends BaseWxPayV2AdapterService implements CPassivePayService{ | |||
| private WxMicroPayOrderP generateWxMicroPayOrderP(WxPayAccount payAccount, WxComposeOrder composeOrder, String productName,WxPayOrder record, EnumPayShare isShare, | |||
| WxAppinfo appInfo, Date currentDate,String bAppId,String bUserPhone) throws Exception { | |||
| @@ -253,7 +253,7 @@ public class WxMiniMaPayAdapterService extends BaseWxPayAdapterService implement | |||
| @Override | |||
| public PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record, WxPayAccount payAccount) | |||
| throws Exception { | |||
| return super.payOrderReverse(appInfo, record, payAccount); | |||
| return super.payOrderReverse(appInfo, record, payAccount,payAccount.getSubMchId()); | |||
| } | |||
| @Override | |||
| @@ -0,0 +1,56 @@ | |||
| package com.iformall.service.pay.service.pay.wx.v3; | |||
| import java.io.File; | |||
| import java.util.Date; | |||
| import java.util.Map; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import com.alibaba.fastjson.JSON; | |||
| import com.alibaba.fastjson.JSONObject; | |||
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | |||
| import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; | |||
| import com.iformall.common.ErrorCode; | |||
| import com.iformall.common.Result; | |||
| import com.iformall.common.ResultData; | |||
| import com.iformall.domain.po.PosCouponOrderVerify; | |||
| import com.iformall.domain.po.WxAppinfo; | |||
| import com.iformall.domain.po.WxBatchOrder; | |||
| import com.iformall.domain.po.WxCouponOrder; | |||
| import com.iformall.domain.po.WxOrder; | |||
| import com.iformall.domain.po.WxPayAccount; | |||
| import com.iformall.domain.po.WxPayOrder; | |||
| import com.iformall.enums.EnumCouponOrderStatus; | |||
| import com.iformall.enums.EnumOrderFrom; | |||
| import com.iformall.enums.EnumOrderStatus; | |||
| import com.iformall.enums.EnumOrderType; | |||
| import com.iformall.enums.EnumPayMode; | |||
| import com.iformall.enums.EnumPayStatus; | |||
| import com.iformall.exception.MallinkException; | |||
| import com.iformall.pay.WxPay; | |||
| import com.iformall.pay.WxPayOrderQ; | |||
| import com.iformall.pay.WxPayOrderSQ; | |||
| import com.iformall.pay.WxPayment; | |||
| import com.iformall.service.QrCodeService; | |||
| import com.iformall.service.helper.WxPayOrderServiceHelper; | |||
| import com.iformall.service.pay.service.pay.PayAdapterService; | |||
| import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | |||
| import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | |||
| import com.iformall.service.pay.service.pay.wx.BaseWxPayAdapterService; | |||
| import com.iformall.utils.BeanUtils; | |||
| import com.iformall.utils.MaUtil; | |||
| import com.iformall.utils.QRCodeUtils; | |||
| import com.iformall.utils.Utility; | |||
| import cn.binarywang.wx.miniapp.api.WxMaService; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaCodeLineColor; | |||
| import lombok.extern.slf4j.Slf4j; | |||
| import me.chanjar.weixin.common.error.WxErrorException; | |||
| import me.chanjar.weixin.open.api.WxOpenService; | |||
| @Slf4j | |||
| public class BaseWxPayV3AdapterService extends BaseWxPayAdapterService{ | |||
| } | |||
| @@ -1,275 +0,0 @@ | |||
| package com.iformall.service.pay.service.pay.wx.v3.miniApp.maPay; | |||
| import java.io.File; | |||
| import java.util.Date; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| import com.iformall.domain.po.*; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.stereotype.Service; | |||
| import com.iformall.common.ErrorCode; | |||
| import com.iformall.common.IdWorker; | |||
| import com.iformall.domain.po.base.TenantEntity; | |||
| import com.iformall.enums.EnumPayMode; | |||
| import com.iformall.enums.EnumPayShare; | |||
| import com.iformall.enums.EnumUserIsSubscribe; | |||
| import com.iformall.exception.MallinkException; | |||
| import com.iformall.mapper.WxCUserBasicInfoMapper; | |||
| import com.iformall.mapper.WxCUserMapper; | |||
| import com.iformall.mapper.WxMallMapper; | |||
| import com.iformall.pay.WxMicroPayOrderP; | |||
| import com.iformall.pay.WxMicroPayOrderSP; | |||
| import com.iformall.pay.WxPay; | |||
| import com.iformall.pay.WxPayment; | |||
| import com.iformall.service.WxCUserService; | |||
| import com.iformall.service.order.entity.WxComposeOrder; | |||
| import com.iformall.service.pay.entity.PayExtraParam; | |||
| import com.iformall.service.pay.service.pay.CPassivePayService; | |||
| import com.iformall.service.pay.service.pay.entity.CreateUser; | |||
| import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | |||
| import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | |||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayAdapterService; | |||
| import com.iformall.utils.BeanUtils; | |||
| import com.iformall.utils.Utility; | |||
| import lombok.extern.slf4j.Slf4j; | |||
| import me.chanjar.weixin.common.error.WxErrorException; | |||
| @Slf4j | |||
| @Service | |||
| public class WxMiniMaPayV3AdapterService implements CPassivePayService{ | |||
| private WxMicroPayOrderP generateWxMicroPayOrderP(WxPayAccount payAccount, WxComposeOrder composeOrder, String productName,WxPayOrder record, EnumPayShare isShare, | |||
| WxAppinfo appInfo, Date currentDate,String bAppId,String bUserPhone) throws Exception { | |||
| String noncestr = Utility.generate32UUID(); | |||
| WxMicroPayOrderP wxPayOrderP = new WxMicroPayOrderP(); | |||
| wxPayOrderP.setAppid(bAppId); | |||
| wxPayOrderP.setMch_id(payAccount.getMchId()); | |||
| wxPayOrderP.setDevice_info(bUserPhone); | |||
| wxPayOrderP.setNonce_str(noncestr); | |||
| wxPayOrderP.setBody(productName); | |||
| wxPayOrderP.setOut_trade_no(record.getPayOrderNo()); | |||
| wxPayOrderP.setTotal_fee(record.getPayAmount()); | |||
| wxPayOrderP.setSpbill_create_ip(record.getIp()); // 终端IP | |||
| wxPayOrderP.setAuth_code(record.getAuthCode()); | |||
| 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 getWxMicroPayOrderPResult(Map<String, String> returnMap,WxPayOrder record,WxPayAccount payAccount) { | |||
| String return_code = returnMap.get("return_code"); | |||
| String result_code = returnMap.get("result_code"); | |||
| PayAdapterResult pr = null; | |||
| if ("SUCCESS".equalsIgnoreCase(return_code)) { | |||
| if ("SUCCESS".equals(result_code)) { | |||
| String openId = returnMap.get("openid"); | |||
| String isSubscribe = returnMap.get("is_subscribe"); | |||
| String transactionId = returnMap.get("transaction_id"); | |||
| record.setTransactionId(transactionId); | |||
| record.setUpdateTime(new Date()); | |||
| pr = new PayAdapterResult(true, "success", returnMap,transactionId); | |||
| } else { | |||
| String err_code = returnMap.get("err_code"); | |||
| String errMsg = returnMap.get("err_code_des"); | |||
| if (errMsg.length() <= 0) { | |||
| errMsg = returnMap.get("return_msg"); | |||
| } | |||
| record.setFailReason(errMsg); | |||
| record.setUpdateTime(new Date()); | |||
| pr = new PayAdapterResult(false, errMsg, returnMap,null); | |||
| } | |||
| } else { | |||
| String errMsg = returnMap.get("return_msg"); | |||
| record.setFailReason(errMsg); | |||
| record.setUpdateTime(new Date()); | |||
| pr = new PayAdapterResult(false, errMsg, returnMap,null); | |||
| } | |||
| return pr; | |||
| } | |||
| private WxMicroPayOrderSP generateWxMicroPayOrderSP(WxPayAccount payAccount, WxComposeOrder composeOrder, String productName,WxPayOrder record, EnumPayShare isShare, | |||
| WxAppinfo appInfo, Date currentDate,String bUserPhone) throws Exception { | |||
| String noncestr = Utility.generate32UUID(); | |||
| WxMicroPayOrderSP wxPayOrderSP = new WxMicroPayOrderSP(); | |||
| wxPayOrderSP.setAppid(appInfo.getParentAppId()); | |||
| wxPayOrderSP.setMch_id(payAccount.getMchId()); | |||
| wxPayOrderSP.setSub_appid(appInfo.getAppId()); | |||
| wxPayOrderSP.setSub_mch_id(payAccount.getSubMchId()); | |||
| wxPayOrderSP.setDevice_info(bUserPhone); | |||
| wxPayOrderSP.setNonce_str(noncestr); | |||
| wxPayOrderSP.setBody(productName); | |||
| wxPayOrderSP.setOut_trade_no(record.getPayOrderNo()); | |||
| wxPayOrderSP.setTotal_fee(record.getPayAmount()); | |||
| wxPayOrderSP.setSpbill_create_ip(record.getIp()); | |||
| wxPayOrderSP.setAuth_code(record.getAuthCode()); | |||
| 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; | |||
| } | |||
| private PayAdapterResult getWxMicroPayOrderSPResutl(Map<String, String> returnMap,WxPayOrder record,WxPayAccount payAccount) { | |||
| PayAdapterResult pr = null; | |||
| String return_code = returnMap.get("return_code"); | |||
| String result_code = returnMap.get("result_code"); | |||
| if ("SUCCESS".equalsIgnoreCase(return_code)) { | |||
| if ("SUCCESS".equals(result_code)) { | |||
| String openId = returnMap.get("sub_openid"); | |||
| String isSubscribe = returnMap.get("sub_is_subscribe"); | |||
| String transactionId = returnMap.get("transaction_id"); | |||
| record.setTransactionId(transactionId); | |||
| record.setUpdateTime(new Date()); | |||
| pr = new PayAdapterResult(true, "success", returnMap,transactionId); | |||
| } else { | |||
| String err_code = returnMap.get("err_code"); | |||
| String errMsg = returnMap.get("err_code_des"); | |||
| if (errMsg.length() <= 0) { | |||
| errMsg = returnMap.get("return_msg"); | |||
| } | |||
| record.setFailReason(errMsg); | |||
| record.setUpdateTime(new Date()); | |||
| pr = new PayAdapterResult(false, errMsg, returnMap,null); | |||
| } | |||
| } else { | |||
| String errMsg = returnMap.get("return_msg"); | |||
| record.setFailReason(errMsg); | |||
| record.setUpdateTime(new Date()); | |||
| pr = new PayAdapterResult(false, errMsg, returnMap,null); | |||
| } | |||
| return pr; | |||
| } | |||
| @Override | |||
| public PayAdapterResult pay(WxPayAccount payAccount,WxPayOrder record, WxComposeOrder composeOrder,List<WxOrder> childOrders, | |||
| String productName, EnumPayShare isShare,WxAppinfo appInfo, Date currentDate, PayExtraParam params) throws Exception { | |||
| if (payAccount.getType() == EnumPayMode.MCH.getCode()) { | |||
| // 扫码支付 普通商户模式 | |||
| String bAppId = (String) params.getValue("bAppId"); | |||
| if (StringUtils.isBlank(bAppId)) { | |||
| throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"bAppId 不能为空"); | |||
| } | |||
| String bUserPhone = (String) params.getValue("bUserPhone"); | |||
| if (StringUtils.isBlank(bUserPhone)) { | |||
| throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"bUserPhone 不能为空"); | |||
| } | |||
| WxMicroPayOrderP wxPayOrderP = generateWxMicroPayOrderP(payAccount, composeOrder,productName,record, isShare, appInfo, currentDate, bAppId, bUserPhone); | |||
| String response = WxPay.micropay(BeanUtils.toStringMap(wxPayOrderP)); | |||
| log.info("pay order, wechat micropay, " + wxPayOrderP.toString() + ", response: " + response.toString()); | |||
| Map<String, String> returnMap = WxPayment.xmlToMap(response); | |||
| returnMap.put("payOrderId", record.getPayOrderNo()); | |||
| returnMap.put("orderId", String.valueOf(composeOrder.getMainOrderId())); | |||
| return getWxMicroPayOrderPResult(returnMap, record, payAccount); | |||
| } else { | |||
| // 统一下单 // 服务商模式 | |||
| String bUserPhone = (String) params.getValue("bUserPhone"); | |||
| if (StringUtils.isBlank(bUserPhone)) { | |||
| throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"bUserPhone 不能为空"); | |||
| } | |||
| WxMicroPayOrderSP wxPayOrderSP = generateWxMicroPayOrderSP(payAccount, composeOrder,productName,record, isShare, appInfo, currentDate, bUserPhone); | |||
| String response = WxPay.micropay(BeanUtils.toStringMap(wxPayOrderSP)); | |||
| log.info("pay order, wechat micropay, " + wxPayOrderSP.toString() + ", response: " + response.toString()); | |||
| Map<String, String> returnMap = WxPayment.xmlToMap(response); | |||
| returnMap.put("payOrderId", record.getPayOrderNo()); | |||
| returnMap.put("orderId", String.valueOf(composeOrder.getMainOrderId())); | |||
| return getWxMicroPayOrderSPResutl(returnMap, record, payAccount); | |||
| } | |||
| } | |||
| @Autowired | |||
| WxCUserMapper wxCUserMapper; | |||
| @Autowired | |||
| WxCUserService wxCUserService; | |||
| @Autowired | |||
| WxCUserBasicInfoMapper wxCUserBasicInfoMapper; | |||
| @Autowired | |||
| WxMallMapper wxMallMapper; | |||
| @Override | |||
| public CreateUser getCUserAfterPay(Object result,WxAppinfo appInfo) throws Exception { | |||
| // add c_user, 收银台支付和券支付可能不是同一个人 | |||
| WxCUser userQ = new WxCUser(); | |||
| Map<String, String> returnMap = (Map<String, String>) result; | |||
| String openId = returnMap.get("sub_openid"); | |||
| //String isSubscribe = returnMap.get("sub_is_subscribe"); | |||
| userQ.setOpenId(openId); | |||
| userQ.setAppId(appInfo.getAppId()); | |||
| userQ.updateTenantInfo(appInfo); | |||
| WxCUser user1 = wxCUserMapper.findByOpenId(userQ); | |||
| if (user1 == null) { | |||
| return null; | |||
| }else { | |||
| return new CreateUser(user1.getId(),user1.getUserId()); | |||
| } | |||
| } | |||
| @Override | |||
| public PayQueryAdapterResult queryPayStatus(WxPayOrder oldRecord, WxAppinfo appInfo, | |||
| WxPayAccount payAccount) throws Exception { | |||
| //return super.queryPayStatus(oldRecord,appInfo, payAccount); | |||
| return null; | |||
| } | |||
| @Override | |||
| public int queryPayStatus(PayQueryAdapterResult statusObject, String orderOutNo) throws Exception { | |||
| //return super.queryPayStatus(statusObject, orderOutNo); | |||
| return 0; | |||
| } | |||
| @Override | |||
| public int queryPayStatusCode(WxPayOrder oldRecord, WxAppinfo appInfo, WxPayAccount payAccount) | |||
| throws Exception { | |||
| //return super.queryPayStatusCode(oldRecord, appInfo, payAccount); | |||
| return 0; | |||
| } | |||
| @Override | |||
| public PayAdapterResult payOrderClose(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) throws Exception { | |||
| //return super.closeOrder(appInfo, record, payAccount); | |||
| return null; | |||
| } | |||
| @Override | |||
| public PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record, WxPayAccount payAccount) | |||
| throws Exception { | |||
| //return super.payOrderReverse(appInfo, record, payAccount); | |||
| return null; | |||
| } | |||
| @Override | |||
| public PayAdapterResult payOrderPush(String openId,WxAppinfo appInfo, WxBatchOrder batchOrder,WxPayOrder payOrder) throws Exception { | |||
| return null; | |||
| } | |||
| @Override | |||
| public File getQrcode(WxAppinfo appinfo,String pageUrl,int type,String sceneParam) throws Exception { | |||
| //return super.getQrCode(appinfo, pageUrl, type, sceneParam); | |||
| return null; | |||
| } | |||
| @Override | |||
| public PayAdapterResult noCreatePay(WxPayOrder record, WxComposeOrder composeOrder, List<WxOrder> childOrders) { | |||
| throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR); | |||
| } | |||
| } | |||