From 9ad28071ce3ccea0a5079597f7c8c82c144ede2b Mon Sep 17 00:00:00 2001 From: xhxu Date: Wed, 18 Oct 2023 15:09:22 +0800 Subject: [PATCH] //pay --- .../controller/CallbackPayController.java | 38 ++ suimangService/pom.xml | 9 +- .../service/pay/alipay/AliPayUtil.java | 357 ------------------ .../service/pay/alipay/api/AliPayApi.java | 319 ---------------- .../api/enums/EnumMemberCardConfig.java | 37 -- .../AlipayMemberCardModelColumn.java | 21 -- .../AlipayMemberCardModelFieldRule.java | 28 -- .../AlipayMemberCardModelRequest.java | 52 --- .../reqEntity/AlipayMemberCardModelStyle.java | 35 -- .../pay/alipay/api/result/UserAuthData.java | 10 - .../pay/alipay/config/AliPayConfig.java | 23 -- .../pay/ali/BaseAliPayAdapterService.java | 93 +++++ .../ali/page/AliPagePayAdapterService.java | 145 +++++++ .../main/java/com/iformall/utils/MaUtil.java | 41 ++ 14 files changed, 322 insertions(+), 886 deletions(-) delete mode 100644 suimangService/src/main/java/com/iformall/service/pay/alipay/AliPayUtil.java delete mode 100644 suimangService/src/main/java/com/iformall/service/pay/alipay/api/AliPayApi.java delete mode 100644 suimangService/src/main/java/com/iformall/service/pay/alipay/api/enums/EnumMemberCardConfig.java delete mode 100644 suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelColumn.java delete mode 100644 suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelFieldRule.java delete mode 100644 suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelRequest.java delete mode 100644 suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelStyle.java delete mode 100644 suimangService/src/main/java/com/iformall/service/pay/alipay/api/result/UserAuthData.java delete mode 100644 suimangService/src/main/java/com/iformall/service/pay/alipay/config/AliPayConfig.java create mode 100644 suimangService/src/main/java/com/iformall/service/pay/service/pay/ali/BaseAliPayAdapterService.java create mode 100644 suimangService/src/main/java/com/iformall/service/pay/service/pay/ali/page/AliPagePayAdapterService.java diff --git a/suimangCApi/src/main/java/com/iformall/controller/CallbackPayController.java b/suimangCApi/src/main/java/com/iformall/controller/CallbackPayController.java index 74f9a09..3237de5 100644 --- a/suimangCApi/src/main/java/com/iformall/controller/CallbackPayController.java +++ b/suimangCApi/src/main/java/com/iformall/controller/CallbackPayController.java @@ -143,4 +143,42 @@ public class CallbackPayController extends BaseController { return resultMap; } + @AuthIgnore + @ApiOperation("支付回调") + @PostMapping(value = "/aliNotify") + public Map _aliNotify(@RequestBody Map paranMap, HttpServletRequest request, HttpServletResponse response) { + logger.debug("[" + getIpAddr() + "] CallbackPayController::_aliNotify"); + Map resultMap = new HashMap<>(); + logger.info("ali支付回调结果通知{}"+JSONObject.toJSONString(paranMap)); + /** + * ----效验数据来源合法 + */ + try{ +// String msg = (String) paranMap.get("msg"); +// String type = (String) paranMap.get("type"); +// +// Map pMap = JSONObject.parseObject(msg, Map.class); +// String appid = (String) pMap.get("appid"); +// WxAppinfo appInfo = wxAppinfoService.getOnlyByAppIdFromRedis(appid); +// WxPayAccount payAccount = wxPayAccountService.getByIdFromRedis(appInfo.getPayId()); +// if("payment".equals(type)){ +// String out_order_no = (String)pMap.get("cp_orderno"); +// +// EnumProductOrderPayVendor payVendorEnum = EnumProductOrderPayVendor.PAY_WAY_TT; +// ProductOrderPay orderPay = productOrderPayService.getByOrder(Long.parseLong(out_order_no), payVendorEnum); +// +// PayAdapterService payAdapterService = payServiceFactory.getPayAdapterService(payVendorEnum.getCode()); +// productOrderPayService.handleProductOrderByQuery(appInfo,payAccount,orderPay,payAdapterService); +// +// resultMap.put("err_no",0); +// resultMap.put("err_tips","success"); +// } + }catch(Exception e){ + logger.error("抖音支付回调处理异常"+e); + resultMap.put("err_no",ErrorCode.SYS_SERVER_ERROR.getCode()); + resultMap.put("err_tips","抖音支付回调处理异常"); + } + return resultMap; + } + } diff --git a/suimangService/pom.xml b/suimangService/pom.xml index 7839808..181bb3c 100644 --- a/suimangService/pom.xml +++ b/suimangService/pom.xml @@ -40,11 +40,12 @@ suimang-mybatis 1.0 + - com.alipay.sdk - alipay-easysdk - 2.2.0 - + com.alipay.sdk + alipay-sdk-java + 4.38.98.ALL + \ No newline at end of file diff --git a/suimangService/src/main/java/com/iformall/service/pay/alipay/AliPayUtil.java b/suimangService/src/main/java/com/iformall/service/pay/alipay/AliPayUtil.java deleted file mode 100644 index 527d85e..0000000 --- a/suimangService/src/main/java/com/iformall/service/pay/alipay/AliPayUtil.java +++ /dev/null @@ -1,357 +0,0 @@ -package com.iformall.service.pay.alipay; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.stereotype.Service; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.alipay.easysdk.base.image.models.AlipayOfflineMaterialImageUploadResponse; -import com.alipay.easysdk.base.oauth.models.AlipaySystemOauthTokenResponse; -import com.alipay.easysdk.kernel.Config; -import com.alipay.easysdk.util.generic.models.AlipayOpenApiGenericResponse; -import com.iformall.service.pay.alipay.api.AliPayApi; -import com.iformall.service.pay.alipay.api.enums.EnumMemberCardConfig; -import com.iformall.service.pay.alipay.api.reqEntity.AlipayMemberCardModelColumn; -import com.iformall.service.pay.alipay.api.reqEntity.AlipayMemberCardModelFieldRule; -import com.iformall.service.pay.alipay.api.reqEntity.AlipayMemberCardModelRequest; -import com.iformall.service.pay.alipay.api.reqEntity.AlipayMemberCardModelStyle; -import com.iformall.service.pay.alipay.api.result.UserAuthData; -import com.iformall.service.pay.alipay.config.AliPayConfig; - -import lombok.extern.slf4j.Slf4j; - -@Component -@Slf4j -public class AliPayUtil { - - @Autowired - AliPayConfig payConfig; - - private Config getConfig() { - //AliPayConfig payConfig = new AliPayConfig(); - //payConfig.setAppId("2021002137663024"); - //payConfig.setAppPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCUfymV5J73QQMG52PVIGUbowkloYCO4B7TQoKbrTZf2YeYsg/To/o4PiXPMNwEUfEUU8NYQ6WwNhCd2fa1ei8WFXJUf3bfgswtBk1aOmHLeY9yoXFxIKMTQ9RcobnmBzKQZlaAPMTSr7t1QtKZKPuc2gEHGRFYKO/ZuL8gIpnsVidVtmi52yd7hzao/pI3ThLA0lreg4L3rYP5ESQZRytxIPgUQ4KI11pZxFgbe+uy28AGDYIQscSIb+SWOHPYKLvOEqqepIZ8M18w/U0lZzpzepzi/V/llekvXJ6UEf1lzl7x/4UIA3WPN1B40+NzbD/OxEGTuM0UctOG6ZTd4Te9AgMBAAECggEAPYksnHbvARspu/SrRCh2fatkIPn6Ijrxyy3mnch7neCw9i/jqxpqmF/4nxFqO0gRlRDZBHyT7p+Y5zDpsW5+kLI2fJmNkzXKkmXoLBnBaOZo8WHBdtXFfjg/iltig9Y7t+cQtXd5QK2eCwuz5dA75FXa0ywqKdRdAGY0nYZ5LpwrHVU8RXheUDCJyhKNj2+W6lIaSKDxLZU3laO1oBrv1agcy7Crd5E2ndb8O3Enga+z7wSz2h7A1BasC/Yl/Ro0Y21wLCH3s/R6qA0Paq12+WEF+xdodM7SrP43CCTVFGbC1TfEOdanJfixop8QuYsIp7pHrL925+vP4eY9RfckgQKBgQDQqLdpDzzU7Ot/L9Vc/r8d4iwXXbX8+HwVFV4oBuausgFyv8eJJpfrI+IlEoB1ubJcPpJBFqfmeYTW6/v6ioFljJAlWfFvesUVt/HszBMIOsU0Bzt7ex6WlwKOagb0q0ZPA4T0OY0K0lg0loaaaR8ZTr4ivDymaGBtTBYhslpc7QKBgQC2MBznGEc5r2dhyENvdPOR20PnXQcevGnPdqSus8m0VmDcHE72RVcckcZtwczsb3NaLSqmjAcWTn51/VFmlvhB3F34FcFTPZGq6sj7fWK8HuFq7l7mu5OzYuVr73zy9ggsUuaw10IqvvwIVxszNAF0hiRnSGH3z27CoRmz3s+8EQKBgQCK3o7atBJ3X4rIJiypbL4DhIB1uJ+jUjk6yvLUTut+fufp1+tTw0S+cS5UIAEw2Lr1G4u5F/v8rwmTBJG6SC4gSLGyui6uVBYRA1BWmedcxchzfRDAeMt9y9kesUAZ3Fe5xIzbAeZ1ulKMBVZmM+pHrJlsgr0Wv0bV1xqvqITtbQKBgBIsIGXopQoa9dvqBtfyOW1eCprkS5aEQqWf9vM6Ga90QjsSU8n6xqKh48IE57TZtQ7UnIF6TCasc66/MsRh4KdpHLJnMR5lcMc0nhF/wz5ychehaTPol+X3wlyOyc7OPah2KG6ROhdbb3ZBggQMduyxiKYIsUTvmuOtAAxR+DSRAoGADtuDzGQDOJYWiO2uuP6FpA5IJaiwlSfu3xncJVfhO8SVr6VBJFg88igbIB3w6nk/sv7j9VTXqXre9HMvp1flxaaLsdxM4HcTSALS9q6t/ajaveqte6S5kAtWx0WW8C6PtgWXHbxcD7LXARSsKLoEl2JXXyUVS/m2l/RzHBQ8GJI="); - //payConfig.setAppPublicKeyCertPath("C://appCertPublicKey_2021002137663024.crt"); - //payConfig.setAlipayCertPath("C://alipayCertPublicKey_RSA2.crt"); - //payConfig.setAlipayRootCertPath("C://alipayRootCert.crt"); - return AliPayApi.getOptions(payConfig.getAppId(), payConfig.getAppPrivateKey(), payConfig.getAppPublicKeyCertPath(), - payConfig.getAlipayCertPath(), payConfig.getAlipayRootCertPath()); - } - - private String getCallBack() { - //AliPayConfig payConfig = new AliPayConfig(); - //payConfig.setCallback("https://callbacktest.malls.iformall.com/api/alipay/notify/callback"); - return payConfig.getCallback(); - } - - //第三方应用授权 - public String getAppAuthUrl(String param) { - try { - return AliPayApi.getAppAuthUrl(getConfig(), getCallBack(), param); - } catch (UnsupportedEncodingException e) { - log.error("alipay getMerchantAuthUrl error. ",e); - } - return null; - } - - //查询app_auth_token - public String getAppAuthToken(String appAuthCode) { - try { - AlipayOpenApiGenericResponse response = AliPayApi.getAppAuthToken(getConfig(),appAuthCode); - JSONObject result = getGenericResponse(response.getHttpBody(),"alipay_open_auth_token_app_response"); - if (null != result) { - JSONArray arrays = result.getJSONArray("tokens"); - if (null != arrays) { - JSONObject resutl0 =arrays.getJSONObject(0); - return resutl0.getString("app_auth_token"); - }else { - log.error("alipay getAppAuthToken error. ",response.getHttpBody()); - } - } - - } catch (Exception e) { - log.error("alipay getAppAuthToken error. ",e); - } - return null; - } - - private static JSONObject getGenericResponseWithCodes(String result,String key,String[] successCodes) { - if (StringUtils.isBlank(result)) { - log.error("alipay apiresponse ["+key+"] error. no result."+result); - return null; - } - JSONObject object = JSON.parseObject(result); - if (null != object) { - JSONObject resultObject = object.getJSONObject(key); - if (null != resultObject ) { - String code = resultObject.getString("code"); - for (String successCode : successCodes) { - if ((successCode.equals(code))) { - return resultObject; - } - } - } - } - log.error("alipay apiresponse ["+key+"] error. "+result); - return null; - } - - private static JSONObject getGenericResponse(String result,String key) { - return getGenericResponseWithCodes(result,key,new String[] {"10000"}); - } - - //门店照片上传 - public String merchantImageUpload(String appAuthToken,String imageName,byte[] file) { - String temfolder = "/alipaytempfile/"+UUID.randomUUID(); - File tempfolerFile = new File(temfolder); - if (!tempfolerFile.exists()) { - tempfolerFile.mkdirs(); - } - String temFilePath = temfolder+"/"+imageName; - File f = new File(temFilePath); - if (f.exists()) { - f.delete(); - } - try { - FileOutputStream fos = new FileOutputStream(f); - fos.write(file); - fos.close(); - AlipayOfflineMaterialImageUploadResponse response = AliPayApi.uploadMerchantImage(getConfig(),appAuthToken,imageName, temFilePath); - JSONObject result = getGenericResponse(response.getHttpBody(),"alipay_offline_material_image_upload_response"); - if (f.exists()) { - f.delete(); - } - if (null != result) { - return result.getString("image_id"); - } - } catch (Exception e) { - if (f.exists()) { - f.delete(); - } - log.error("alipay merchantImageUpload error. ",e); - } - return null; - } - - //创建商圈会员卡 - public String createSmartDistrictMemberCardModel(String appAuthToken,String cardName,String logoId,String backImageId) { - AlipayMemberCardModelRequest request = new AlipayMemberCardModelRequest(); - AlipayMemberCardModelStyle style = new AlipayMemberCardModelStyle(); - style.setCard_show_name(cardName); - style.setLogo_id(logoId); - style.setBackground_id(backImageId); - request.setTemplate_style_info(style); - - List columnList = new ArrayList(); - AlipayMemberCardModelColumn column0 = new AlipayMemberCardModelColumn(); - column0.setCode("TELEPHONE"); - column0.setTitle("联系电话"); - columnList.add(column0); - AlipayMemberCardModelColumn column1 = new AlipayMemberCardModelColumn(); - column1.setCode("BENEFIT_INFO"); - column1.setTitle("会员专享"); - columnList.add(column1); - request.setColumn_info_list(columnList); - - List ruleList = new ArrayList(); - AlipayMemberCardModelFieldRule rule0 = new AlipayMemberCardModelFieldRule(); - rule0.setField_name("Balance"); - rule0.setRule_name("ASSIGN_FROM_REQUEST"); - rule0.setRule_value("Balance"); - ruleList.add(rule0); - request.setField_rule_list(ruleList); - - try { - AlipayOpenApiGenericResponse response = AliPayApi.createMemberCardModel(getConfig(),appAuthToken, request); - JSONObject result = getGenericResponse(response.getHttpBody(),"alipay_marketing_card_template_create_response"); - if (null != result) { - return result.getString("template_id"); - } - } catch (Exception e) { - log.error("alipay createSmartDistrictMemberCardModel error. ",e); - } - return null; - } - - //创建商圈会员卡表单配置 - public boolean setSmartDistrictMemberCardModelConfig(String appAuthToken,String templateId) { - try { -// AlipayOpenApiGenericResponse response = AliPayApi.setMemberCardModelConfig(getConfig(),appAuthToken, templateId, -// new String[] {EnumMemberCardConfig.OPEN_FORM_FIELD_MOBILE.getCode()},new String[] {EnumMemberCardConfig.OPEN_FORM_FIELD_NAME.getCode()}); - AlipayOpenApiGenericResponse response = AliPayApi.setMemberCardModelConfig(getConfig(),appAuthToken, templateId, - new String[] {EnumMemberCardConfig.OPEN_FORM_FIELD_MOBILE.getCode()},null); - JSONObject result = getGenericResponse(response.getHttpBody(),"alipay_marketing_card_formtemplate_set_response"); - if (null != result) { - return true; - } - } catch (Exception e) { - log.error("alipay setSmartDistrictMemberCardModelConfig error. ",e); - } - return false; - } - - //获取商圈会员卡领卡投放链接 - public String getSmartDistrictMemberCardUrl(String appAuthToken,String templateId,String param) { - try { - AlipayOpenApiGenericResponse response = AliPayApi.getMemberCardUrl(getConfig(),appAuthToken, templateId, param, getCallBack()); - JSONObject result = getGenericResponse(response.getHttpBody(),"alipay_marketing_card_activateurl_apply_response"); - if (null != result) { - return result.getString("apply_card_url"); - } - } catch (Exception e) { - log.error("alipay getSmartDistrictMemberCardUrl error. ",e); - } - return null; - } - - //商圈智能积分授权(算法授权)URL - public String getH5SmartDistrictMallVipPointsUrl(String param) { - try { - return "https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id="+getConfig().appId+"&scope=mall_vip_points&redirect_uri="+URLEncoder.encode(getCallBack(),"utf-8")+"&state="+param; - } catch (UnsupportedEncodingException e) { - log.error("alipay getH5MallVipPointsUrl error. ",e); - } - return null; - } - - //获取用户授权令牌 - public UserAuthData queryUserAuthData(String appAuthToken,String authCode) { - try { - AlipayOpenApiGenericResponse response = AliPayApi.queryUserAuthData(getConfig(), appAuthToken, authCode); - //JSONObject result = getGenericResponse(response.getHttpBody(),"alipay_system_oauth_token_response"); - JSONObject responseResult = JSON.parseObject(response.getHttpBody()); - if (null != responseResult) { - JSONObject result = responseResult.getJSONObject("alipay_system_oauth_token_response"); - if (null != result) { - UserAuthData authData = new UserAuthData(); - authData.setUserId(result.getString("user_id")); - authData.setAccessToken(result.getString("access_token")); - return authData; - }else { - log.error("alipay queryUserAuthData error. "+response.getHttpBody()); - } - } - } catch (Exception e) { - log.error("alipay queryUserAuthData error. ",e); - } - return null; - } - - //查询用户表单信息 - public Map queryUserFormData(String appAuthToken,String authToken,String templateId,String requestId) { - try { - AlipayOpenApiGenericResponse response = AliPayApi.queryUserFormData(getConfig(), appAuthToken, authToken, templateId, requestId); - JSONObject result = getGenericResponse(response.getHttpBody(),"alipay_marketing_card_activateform_query_response"); - if (null != result) { - String infos = result.getString("infos"); - if (StringUtils.isBlank(infos)) { - return null; - } - - JSONArray infosArray = JSON.parseArray(infos); - if (null == infosArray) { - return null; - } - Map map = new HashMap(); - for (int i = 0 ; i < infosArray.size(); i++) { - Map jo = (Map)infosArray.get(i); - Object[] keys = jo.keySet().toArray(); - EnumMemberCardConfig config = EnumMemberCardConfig.getEnum(String.valueOf(keys[0])); - if (null != config) { - map.put(config, jo.get(keys[0])); - } - } - if (map.isEmpty()) { - return null; - } - return map; - } - } catch (Exception e) { - log.error("alipay queryUserFormData error. ",e); - } - return null; - } - - //用户开卡 - public boolean openCard(String appAuthToken,String authToken,String templateId,String userId) { - try { - AlipayOpenApiGenericResponse response = AliPayApi.openCard(getConfig(), appAuthToken, authToken, templateId, userId); - JSONObject result = getGenericResponse(response.getHttpBody(),"alipay_marketing_card_open_response"); - if (null != result) { - return true; - } - } catch (Exception e) { - log.error("alipay openCard error. ",e); - } - return false; - } - - //商圈消息订阅 - public boolean smartDistrictTopicSubscribe(String appAuthToken,String topic) { - try { - AlipayOpenApiGenericResponse response = AliPayApi.topicSubscribe(getConfig(),appAuthToken, "app_auth", topic, "HTTP", "BIZ_TAG"); - JSONObject result = getGenericResponseWithCodes(response.getHttpBody(),"alipay_open_app_message_topic_subscribe_response",new String[] {"40004","10000"}); - if (null != result) { - return true; - } - } catch (Exception e) { - log.error("alipay smartDistrictTopicSubscribe error. ",e); - } - return false; - } - - public static byte[] File2byte(File tradeFile){ - byte[] buffer = null; - try - { - FileInputStream fis = new FileInputStream(tradeFile); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int n; - while ((n = fis.read(b)) != -1) - { - bos.write(b, 0, n); - } - fis.close(); - bos.close(); - buffer = bos.toByteArray(); - }catch (FileNotFoundException e){ - e.printStackTrace(); - }catch (IOException e){ - e.printStackTrace(); - } - return buffer; - } - - public static void main(String[] args) { - AliPayUtil util = new AliPayUtil(); -// String token = getAppAuthToken("Pfbe94a5103a0414db99ce865204ee63"); -// System.out.println(token); - //File file = new File("C://logo-img.png"); - //System.out.println(util.merchantImageUpload("202104BB054c88e950ba4513854e4275ff71cF63", "aa.jpg", File2byte(file))); - //System.out.println(util.createSmartDistrictMemberCardModel("202104BB054c88e950ba4513854e4275ff71cF63", "会员卡", "OKJx3oOPTUOaINs0AQ_qMgAAACMAAQQD", "OKJx3oOPTUOaINs0AQ_qMgAAACMAAQQD")); - //System.out.println(util.setSmartDistrictMemberCardModelConfig("202104BB054c88e950ba4513854e4275ff71cF63", "20210417000000002702655000300637")); - //System.out.println(util.getSmartDistrictMemberCardUrl("202104BB054c88e950ba4513854e4275ff71cF63", "20210417000000002702655000300637", "https://ctest.malls.iformall.com/C/api/alipay/callback", "123")); - //System.out.println(util.getH5SmartDistrictMallVipPointsUrl("2021002139648762", "https://ctest.malls.iformall.com/C/api/alipay/callback", "123")); - System.out.println(util.smartDistrictTopicSubscribe("202104BB054c88e950ba4513854e4275ff71cF63","alipay.business.mall.trade.success")); - } - -} diff --git a/suimangService/src/main/java/com/iformall/service/pay/alipay/api/AliPayApi.java b/suimangService/src/main/java/com/iformall/service/pay/alipay/api/AliPayApi.java deleted file mode 100644 index 7a96f7c..0000000 --- a/suimangService/src/main/java/com/iformall/service/pay/alipay/api/AliPayApi.java +++ /dev/null @@ -1,319 +0,0 @@ -package com.iformall.service.pay.alipay.api; - -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import org.apache.commons.lang3.StringUtils; - -import com.alibaba.fastjson.JSON; -import com.alipay.easysdk.base.image.models.AlipayOfflineMaterialImageUploadResponse; -import com.alipay.easysdk.base.oauth.models.AlipaySystemOauthTokenResponse; -import com.alipay.easysdk.factory.Factory; -import com.alipay.easysdk.kernel.Config; -import com.alipay.easysdk.util.generic.models.AlipayOpenApiGenericResponse; -import com.iformall.common.IdWorker; -import com.iformall.service.pay.alipay.api.reqEntity.AlipayMemberCardModelColumn; -import com.iformall.service.pay.alipay.api.reqEntity.AlipayMemberCardModelFieldRule; -import com.iformall.service.pay.alipay.api.reqEntity.AlipayMemberCardModelRequest; -import com.iformall.service.pay.alipay.api.reqEntity.AlipayMemberCardModelStyle; -import com.iformall.utils.DateUtils; - -/** - * SDK说明 https://opendocs.alipay.com/open/54/00y8k9 - * 综合体支付积分https://opendocs.alipay.com/open/01lsmc?scene=SC00001296 - * @author alascor - */ -public class AliPayApi { - - /** - * https://opendocs.alipay.com/open/291/105971 - * @param - * appId:应用ID, isv模式则为第三方应用ID, 非isv模式则为自研应用ID - * appPrivateKey: 应用私钥字符串,isv模式则为第三方应用私钥, 非isv模式则为自研应用私钥。产生地址为https://miniu.alipay.com/keytool/create - * appPublicKeyCertPath: 应用公钥文件本地地址。isv模式则为第三方应用公钥文件本地地址, 非isv模式则为自研应用公钥文件本地地址。 获取路径:https://open.alipay.com/dev/workspace/key-manage,"接口加签方式:"设置里面下载 - * alipayCertPath: 支付宝公钥证书文件路径. isv模式则为第三方应用支付宝公钥证书文件路径, 非isv模式则为自研应用支付宝公钥证书文件路径。 - * alipayRootCertPath: 支付宝根证书文件路径.isv模式则为第三方应用支付宝根证书文件路径, 非isv模式则为自研应用支付宝根证书文件路径。 - * @return - */ - public static Config getOptions(String appId,String appPrivateKey,String appPublicKeyCertPath,String alipayCertPath,String alipayRootCertPath) { - Config config = new Config(); - config.protocol = "https"; - config.gatewayHost = "openapi.alipay.com"; - config.signType = "RSA2"; - - config.appId = appId; - - // 为避免私钥随源码泄露,推荐从文件中读取私钥字符串而不是写入源码中 - config.merchantPrivateKey = appPrivateKey; - - //#注:证书文件路径支持设置为文件系统中的路径或CLASS_PATH中的路径,优先从文件系统中加载,加载失败后会继续尝试从CLASS_PATH中加载 - config.merchantCertPath = appPublicKeyCertPath; - config.alipayCertPath = alipayCertPath; - config.alipayRootCertPath = alipayRootCertPath; - - //#####注:如果采用非证书模式,则无需赋值上面的三个证书路径,改为赋值如下的支付宝公钥字符串即可 - //config.alipayPublicKey = appPublicKey; - - //可设置异步通知接收服务地址(可选) - //config.notifyUrl = "<-- 请填写您的支付类接口异步通知接收服务地址,例如:https://www.test.com/callback -->"; - - //可设置AES密钥,调用AES加解密相关接口时需要(可选) - //config.encryptKey = "<-- 请填写您的AES密钥,例如:aa4BtZ4tspm2wnXLb1ThQA== -->"; - - return config; - } - - /** - * https://opendocs.alipay.com/open/common/105193 - * 第三方应用授权 - * @throws UnsupportedEncodingException - */ - public static String getAppAuthUrl(Config config,String callback,String param) throws UnsupportedEncodingException { - String paramstr = ""; - if (!StringUtils.isBlank(param)) { - paramstr = "&state="+param; - } - return "https://openauth.alipay.com/oauth2/appToAppBatchAuth.htm?app_id="+config.appId+"&application_type=TINYAPP,WEBAPP,MOBILEAPP,PUBLICAPP&redirect_uri="+URLEncoder.encode(callback, "utf-8")+paramstr; - } - - /** - * https://opendocs.alipay.com/open/common/105193 - * https://opendocs.alipay.com/apis/api_9/alipay.open.auth.token.app - * 换取应用授权令牌(非ISV模式) - * @throws Exception - */ -// public static AlipaySystemOauthTokenResponse getAppAuthToken(Config config,String appAuthCode) throws Exception { -// Factory.setOptions(config); -// AlipaySystemOauthTokenResponse response = Factory.Base.OAuth().getToken(appAuthCode); -// return response; -// } - - /** - * https://opendocs.alipay.com/support/01ratr - * https://opendocs.alipay.com/apis/api_9/alipay.open.auth.token.app - * 换取应用授权令牌(ISV模式) - * @throws Exception - */ - public static AlipayOpenApiGenericResponse getAppAuthToken(Config config,String appAuthCode) throws Exception { - Factory.setOptions(config); - //设置系统参数(OpenAPI中非biz_content里的参数) - //Map textParams = new HashMap(); - //textParams.put("app_auth_token", appAuthToken); - - //设置业务参数(OpenAPI中biz_content里的参数) - Map bizParams = new HashMap(); - bizParams.put("grant_type","authorization_code"); - bizParams.put("code",appAuthCode); - AlipayOpenApiGenericResponse response = Factory.Util.Generic() - .execute("alipay.open.auth.token.app", null, bizParams); - return response; - } - - /** - * https://opendocs.alipay.com/apis/api_3/alipay.offline.material.image.upload - * 上传门店照片和视频接口 - * @throws Exception - */ - public static AlipayOfflineMaterialImageUploadResponse uploadMerchantImage(Config config,String appAuthToken,String imageName,String localImagePath) throws Exception { - Factory.setOptions(config); - AlipayOfflineMaterialImageUploadResponse response = Factory.Base.Image().agent(appAuthToken).upload(imageName, localImagePath); - return response; - } - - /** - * https://opendocs.alipay.com/apis/api_5/alipay.marketing.card.template.create - * 会员卡模板创建 - * @throws Exception - */ - public static AlipayOpenApiGenericResponse createMemberCardModel(Config config,String appAuthToken,AlipayMemberCardModelRequest modelRequest) throws Exception { - Factory.setOptions(config); - //设置系统参数(OpenAPI中非biz_content里的参数) - Map textParams = new HashMap(); - textParams.put("app_auth_token", appAuthToken); - - //设置业务参数(OpenAPI中biz_content里的参数) - Map bizParams = new HashMap(); - IdWorker idWorker = IdWorker.get(); - bizParams.put("request_id", String.valueOf(idWorker.nextId())); - bizParams.put("card_type", modelRequest.getCard_type()); - bizParams.put("biz_no_suffix_len",modelRequest.getBiz_no_suffix_len()); - bizParams.put("write_off_type", modelRequest.getWrite_off_type()); - - AlipayMemberCardModelStyle style = modelRequest.getTemplate_style_info(); - bizParams.put("template_style_info", style); - - List columnList = modelRequest.getColumn_info_list(); - bizParams.put("column_info_list", columnList); - - List ruleList = modelRequest.getField_rule_list(); - bizParams.put("field_rule_list", ruleList); - - AlipayOpenApiGenericResponse response = Factory.Util.Generic().execute( - "alipay.marketing.card.template.create", textParams, bizParams); - return response; - - } - - /** - * https://opendocs.alipay.com/apis/api_5/alipay.marketing.card.formtemplate.set - * 会员卡开卡表单模板配置 - * @throws Exception - */ - public static AlipayOpenApiGenericResponse setMemberCardModelConfig(Config config,String appAuthToken,String templateId,String[] requiredFields,String[] optionalFields) throws Exception { - Factory.setOptions(config); - //设置系统参数(OpenAPI中非biz_content里的参数) - Map textParams = new HashMap(); - textParams.put("app_auth_token", appAuthToken); - - //设置业务参数(OpenAPI中biz_content里的参数) - Map bizParams = new HashMap(); - bizParams.put("template_id", templateId); - Map extendParams = new HashMap<>(); - Map requireds = new HashMap(); - requireds.put("common_fields", requiredFields); - extendParams.put("required", JSON.toJSONString(requireds)); - if (null != optionalFields) { - Map optional = new HashMap(); - optional.put("common_fields", optionalFields); - extendParams.put("optional", JSON.toJSONString(optional)); - } - bizParams.put("fields", extendParams); - - AlipayOpenApiGenericResponse response = Factory.Util.Generic().execute( - "alipay.marketing.card.formtemplate.set", textParams, bizParams); - return response; - } - - /** - * https://opendocs.alipay.com/apis/api_5/alipay.marketing.card.activateurl.apply - * 获取会员卡领卡投放链接 - * @param callback为子应用回调地址,非ISV应用。 必须跟子应用的后台回调弟子配置一致。 - */ - public static AlipayOpenApiGenericResponse getMemberCardUrl(Config config,String appAuthToken,String templateId,String exparam,String callback) throws Exception { - Factory.setOptions(config); - //设置系统参数(OpenAPI中非biz_content里的参数) - Map textParams = new HashMap(); - textParams.put("app_auth_token", appAuthToken); - - //设置业务参数(OpenAPI中biz_content里的参数) - Map bizParams = new HashMap(); - bizParams.put("template_id", templateId); - bizParams.put("out_string", exparam); - bizParams.put("callback", callback); - AlipayOpenApiGenericResponse response = Factory.Util.Generic().execute( - "alipay.marketing.card.activateurl.apply", textParams, bizParams); - return response; - } - - /** - * https://opendocs.alipay.com/apis/api_9/alipay.system.oauth.token - * 会员授权,换取授权访问令牌 - * @return - * @throws Exception - */ - public static AlipayOpenApiGenericResponse queryUserAuthData(Config config,String appAuthToken,String authCode) throws Exception { - Factory.setOptions(config); - //设置系统参数(OpenAPI中非biz_content里的参数) - Map textParams = new HashMap(); - textParams.put("app_auth_token", appAuthToken); - textParams.put("grant_type", "authorization_code"); - textParams.put("code", authCode); - AlipayOpenApiGenericResponse response = Factory.Util.Generic().execute( - "alipay.system.oauth.token", textParams, null); - return response; - } - - /** - * https://opendocs.alipay.com/apis/api_5/alipay.marketing.card.activateform.query - * 查询用户提交的会员卡表单信息 - * @return - * @throws Exception - */ - public static AlipayOpenApiGenericResponse queryUserFormData(Config config,String appAuthToken,String authToken,String templateId,String requestId) throws Exception { - Factory.setOptions(config); - //设置系统参数(OpenAPI中非biz_content里的参数) - Map textParams = new HashMap(); - textParams.put("app_auth_token", appAuthToken); - textParams.put("auth_token", authToken); - - //设置业务参数(OpenAPI中biz_content里的参数) - Map bizParams = new HashMap(); - bizParams.put("biz_type", "MEMBER_CARD"); - bizParams.put("template_id", templateId); - bizParams.put("request_id", requestId); - AlipayOpenApiGenericResponse response = Factory.Util.Generic().execute( - "alipay.marketing.card.activateform.query", textParams, bizParams); - return response; - } - - /** - * https://opendocs.alipay.com/apis/api_5/alipay.marketing.card.open - * 会员卡开卡 - * @return - * @throws Exception - */ - public static AlipayOpenApiGenericResponse openCard(Config config,String appAuthToken,String authToken,String templateId,String userId) throws Exception { - Factory.setOptions(config); - //设置系统参数(OpenAPI中非biz_content里的参数) - Map textParams = new HashMap(); - textParams.put("app_auth_token", appAuthToken); - textParams.put("auth_token", authToken); - - //设置业务参数(OpenAPI中biz_content里的参数) - Map bizParams = new HashMap(); - IdWorker idWorker = IdWorker.get(); - bizParams.put("out_serial_no", String.valueOf(idWorker.nextId())); - bizParams.put("card_template_id", templateId); - - Map userInfoMap = new HashMap(); - userInfoMap.put("user_uni_id", userId); - userInfoMap.put("user_uni_id_type", "UID"); - bizParams.put("card_user_info", userInfoMap); - - Map extInfoMap = new HashMap(); - extInfoMap.put("open_date", new Date()); - extInfoMap.put("valid_date", DateUtils.stringToDate("2051-05-01 00:00:00",DateUtils.DATE_TIME_PATTERN)); - extInfoMap.put("external_card_no",String.valueOf(idWorker.nextId())); - bizParams.put("card_ext_info", extInfoMap); - - AlipayOpenApiGenericResponse response = Factory.Util.Generic().execute( - "alipay.marketing.card.open", textParams, bizParams); - return response; - } - - - /** - * https://opendocs.alipay.com/apis/api_9/alipay.open.app.message.topic.subscribe - * 订阅消息主题 - * - * 需要联系BD 给商圈挂载“支付宝商圈交易成功信息订阅”功能包 - * https://openhome.alipay.com/svr/ability/solution/SC00001010/xxdy (对接会员卡的应用AppId用ISV的应用ID) - * - * @return - * @throws Exception - */ - public static AlipayOpenApiGenericResponse topicSubscribe(Config config,String authToken,String authType,String topic,String type,String tag) throws Exception { - Factory.setOptions(config); - //设置系统参数(OpenAPI中非biz_content里的参数) - //Map textParams = new HashMap(); - //textParams.put("app_auth_token", appAuthToken); - - //设置业务参数(OpenAPI中biz_content里的参数) - Map bizParams = new HashMap(); - bizParams.put("auth_token", authToken); - bizParams.put("auth_type", authType); - bizParams.put("topic", topic); - bizParams.put("comm_type", type); - if (!StringUtils.isBlank(tag)) { - bizParams.put("tag",tag); - } - AlipayOpenApiGenericResponse response = Factory.Util.Generic().execute( - "alipay.open.app.message.topic.subscribe", null, bizParams); - return response; - } -} diff --git a/suimangService/src/main/java/com/iformall/service/pay/alipay/api/enums/EnumMemberCardConfig.java b/suimangService/src/main/java/com/iformall/service/pay/alipay/api/enums/EnumMemberCardConfig.java deleted file mode 100644 index 9231872..0000000 --- a/suimangService/src/main/java/com/iformall/service/pay/alipay/api/enums/EnumMemberCardConfig.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.iformall.service.pay.alipay.api.enums; - - -/** - * @author gongbiao - */ -public enum EnumMemberCardConfig { - - OPEN_FORM_FIELD_MOBILE("OPEN_FORM_FIELD_MOBILE", "手机号"), - OPEN_FORM_FIELD_GENDER("OPEN_FORM_FIELD_GENDER", "性别"), - OPEN_FORM_FIELD_NAME("OPEN_FORM_FIELD_NAME", "姓名"); - - public static EnumMemberCardConfig getEnum(String code) { - for (EnumMemberCardConfig value : values()) { - if (value.getCode().equals(code)) { - return value; - } - } - return null; - } - - private String code; - private String message; - - EnumMemberCardConfig(String code, String message) { - this.code = code; - this.message = message; - } - - public String getCode() { - return code; - } - - public String getMessage() { - return message; - } -} diff --git a/suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelColumn.java b/suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelColumn.java deleted file mode 100644 index 16a569a..0000000 --- a/suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelColumn.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.iformall.service.pay.alipay.api.reqEntity; - -import com.aliyun.tea.TeaModel; - -public class AlipayMemberCardModelColumn{ - - private String code;//标准栏位:行为由支付宝统一定,同时已经分配标准Code - private String title;//栏目的标题 - public String getCode() { - return code; - } - public void setCode(String code) { - this.code = code; - } - public String getTitle() { - return title; - } - public void setTitle(String title) { - this.title = title; - } -} diff --git a/suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelFieldRule.java b/suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelFieldRule.java deleted file mode 100644 index e1847ec..0000000 --- a/suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelFieldRule.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.iformall.service.pay.alipay.api.reqEntity; - -import com.aliyun.tea.TeaModel; - -public class AlipayMemberCardModelFieldRule{ - - private String field_name;//字段名称,现在支持如下几个Key(暂不支持自定义) - private String rule_name;//规则名 - private String rule_value;//根据rule_name,采取相应取值策略 - public String getField_name() { - return field_name; - } - public void setField_name(String field_name) { - this.field_name = field_name; - } - public String getRule_name() { - return rule_name; - } - public void setRule_name(String rule_name) { - this.rule_name = rule_name; - } - public String getRule_value() { - return rule_value; - } - public void setRule_value(String rule_value) { - this.rule_value = rule_value; - } -} diff --git a/suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelRequest.java b/suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelRequest.java deleted file mode 100644 index 86d5ffe..0000000 --- a/suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelRequest.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.iformall.service.pay.alipay.api.reqEntity; - -import java.util.List; - -import com.aliyun.tea.NameInMap; -import com.aliyun.tea.Validation; - -public class AlipayMemberCardModelRequest{ - - private String card_type="OUT_MEMBER_CARD";//卡类型。可选类型如下:OUT_MEMBER_CARD:外部权益卡 - private String biz_no_suffix_len ="8";//业务卡号后缀的长度,取值范围为[8,32] - private String write_off_type = "qrcode";//卡包详情页面中展现出的卡码 - private AlipayMemberCardModelStyle template_style_info;//模板样式信息 - private List column_info_list;//栏位信息 - private List field_rule_list;//字段规则列表,会员卡开卡过程中,会员卡信息的生成规则 - public String getCard_type() { - return card_type; - } - public void setCard_type(String card_type) { - this.card_type = card_type; - } - public String getBiz_no_suffix_len() { - return biz_no_suffix_len; - } - public void setBiz_no_suffix_len(String biz_no_suffix_len) { - this.biz_no_suffix_len = biz_no_suffix_len; - } - public String getWrite_off_type() { - return write_off_type; - } - public void setWrite_off_type(String write_off_type) { - this.write_off_type = write_off_type; - } - public AlipayMemberCardModelStyle getTemplate_style_info() { - return template_style_info; - } - public void setTemplate_style_info(AlipayMemberCardModelStyle template_style_info) { - this.template_style_info = template_style_info; - } - public List getColumn_info_list() { - return column_info_list; - } - public void setColumn_info_list(List column_info_list) { - this.column_info_list = column_info_list; - } - public List getField_rule_list() { - return field_rule_list; - } - public void setField_rule_list(List field_rule_list) { - this.field_rule_list = field_rule_list; - } -} diff --git a/suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelStyle.java b/suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelStyle.java deleted file mode 100644 index b88f1fb..0000000 --- a/suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelStyle.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.iformall.service.pay.alipay.api.reqEntity; - -import com.aliyun.tea.TeaModel; - -public class AlipayMemberCardModelStyle{ - - private String card_show_name;//钱包端显示名称(字符串长度) - private String logo_id;//logo的图片ID - private String background_id;//背景图片Id - private String bg_color="rgb(55,112,179)";//字体颜色(非背景色),只影响卡详情中部信息区域字体颜色 - public String getCard_show_name() { - return card_show_name; - } - public void setCard_show_name(String card_show_name) { - this.card_show_name = card_show_name; - } - public String getLogo_id() { - return logo_id; - } - public void setLogo_id(String logo_id) { - this.logo_id = logo_id; - } - public String getBackground_id() { - return background_id; - } - public void setBackground_id(String background_id) { - this.background_id = background_id; - } - public String getBg_color() { - return bg_color; - } - public void setBg_color(String bg_color) { - this.bg_color = bg_color; - } -} diff --git a/suimangService/src/main/java/com/iformall/service/pay/alipay/api/result/UserAuthData.java b/suimangService/src/main/java/com/iformall/service/pay/alipay/api/result/UserAuthData.java deleted file mode 100644 index a7b3b10..0000000 --- a/suimangService/src/main/java/com/iformall/service/pay/alipay/api/result/UserAuthData.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.iformall.service.pay.alipay.api.result; - -import lombok.Data; - -@Data -public class UserAuthData { - - private String userId; - private String accessToken; -} diff --git a/suimangService/src/main/java/com/iformall/service/pay/alipay/config/AliPayConfig.java b/suimangService/src/main/java/com/iformall/service/pay/alipay/config/AliPayConfig.java deleted file mode 100644 index 663fb9d..0000000 --- a/suimangService/src/main/java/com/iformall/service/pay/alipay/config/AliPayConfig.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.iformall.service.pay.alipay.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; -import org.springframework.stereotype.Component; - -/** - * alipay 配置 - */ -@Data -@Configuration -@ConfigurationProperties(prefix = "alipay.open") -public class AliPayConfig { - - private String appId; - private String appPrivateKey; - private String appPublicKeyCertPath; - private String alipayCertPath; - private String alipayRootCertPath; - private String callback; - -} \ No newline at end of file diff --git a/suimangService/src/main/java/com/iformall/service/pay/service/pay/ali/BaseAliPayAdapterService.java b/suimangService/src/main/java/com/iformall/service/pay/service/pay/ali/BaseAliPayAdapterService.java new file mode 100644 index 0000000..a60035b --- /dev/null +++ b/suimangService/src/main/java/com/iformall/service/pay/service/pay/ali/BaseAliPayAdapterService.java @@ -0,0 +1,93 @@ +package com.iformall.service.pay.service.pay.ali; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alipay.api.AlipayClient; +import com.alipay.api.request.AlipayTradeQueryRequest; +import com.alipay.api.response.AlipayTradeQueryResponse; +import com.iformall.common.ErrorCode; +import com.iformall.domain.po.ProductOrderPay; +import com.iformall.domain.po.WxAppinfo; +import com.iformall.domain.po.WxPayAccount; +import com.iformall.domain.po.WxPayOrder; +import com.iformall.enums.EnumPayOrderStatus; +import com.iformall.exception.MallinkException; +import com.iformall.service.pay.service.pay.entity.PayAdapterResult; +import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; +import com.iformall.utils.MaUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.HashMap; +import java.util.Map; + +@Slf4j +public class BaseAliPayAdapterService { + + @Autowired + protected MaUtil maUtil; + + /** + * 做为支付的扩展数据 + * @param + * @return + */ + protected String getCallbackData(WxPayOrder record) { + Map map = new HashMap<>(); + map.put("composeOrderId",record.getOrderId()); + map.put("tenantId",record.getTenantId()); + return JSON.toJSONString(map); + } + + protected PayQueryAdapterResult queryPayStatus(ProductOrderPay orderPay, WxAppinfo appInfo, WxPayAccount payAccount) + throws Exception { + AlipayClient alipayClient = maUtil.getAliPayClient(appInfo, payAccount); + AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); + JSONObject bizContent = new JSONObject(); + //商户订单号,商家自定义,保持唯一性 + bizContent.put("out_trade_no", orderPay.getOrderNumber()); + + request.setBizContent(bizContent.toString()); + AlipayTradeQueryResponse response = alipayClient.execute(request); + + if(response.isSuccess()){ + if("10000".equals(response.getCode())){ + PayQueryAdapterResult result = new PayQueryAdapterResult(); + result.setCode(getPayStatusFrom(response.getTradeStatus())); + result.setTransactionId(response.getTradeNo()); + return result; + } + if("ACQ.TRADE_NOT_EXIST".equals(response.getSubCode())){ + PayQueryAdapterResult result = new PayQueryAdapterResult(); + result.setCode(EnumPayOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); + result.setMsg(EnumPayOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getMessage()); + return result; + } + } + throw new MallinkException(ErrorCode.PAY_ORDER_QUERY_ERROR); + } + + private int getPayStatusFrom(String trade_status){ + if("WAIT_BUYER_PAY".equals(trade_status)){ + return EnumPayOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode(); + }else if("TRADE_CLOSED".equals(trade_status)){ + return EnumPayOrderStatus.ORDER_STATUS_OVERTIME_CANCEL.getCode(); + }else if("TRADE_SUCCESS".equals(trade_status)){ + return EnumPayOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode(); + }else if("TRADE_FINISHED".equals(trade_status)){ + return EnumPayOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode(); + } + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "订单查询支付宝支付状态失败"+trade_status); + } + + + protected int queryPayStatus(PayQueryAdapterResult statusObject, String orderOutNo) throws Exception { + return statusObject.getCode(); + } + + protected PayAdapterResult closeOrder(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) { + return new PayAdapterResult(true, "success", null, null); + } + + +} diff --git a/suimangService/src/main/java/com/iformall/service/pay/service/pay/ali/page/AliPagePayAdapterService.java b/suimangService/src/main/java/com/iformall/service/pay/service/pay/ali/page/AliPagePayAdapterService.java new file mode 100644 index 0000000..3a8bde4 --- /dev/null +++ b/suimangService/src/main/java/com/iformall/service/pay/service/pay/ali/page/AliPagePayAdapterService.java @@ -0,0 +1,145 @@ +package com.iformall.service.pay.service.pay.ali.page; + +import com.alibaba.fastjson.JSONObject; +import com.alipay.api.AlipayClient; +import com.alipay.api.request.AlipayTradePagePayRequest; +import com.alipay.api.response.AlipayTradePagePayResponse; +import com.iformall.domain.po.*; +import com.iformall.enums.*; +import com.iformall.service.order.OrderFactory; +import com.iformall.service.order.entity.WxComposeOrder; +import com.iformall.service.pay.entity.PayExtraParam; +import com.iformall.service.pay.service.pay.CDrivingPayService; +import com.iformall.service.pay.service.pay.ali.BaseAliPayAdapterService; +import com.iformall.service.pay.service.pay.entity.PayAdapterResult; +import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; +import com.iformall.utils.DateUtils; +import com.iformall.utils.MaUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.util.*; + +@Slf4j +@Service +public class AliPagePayAdapterService extends BaseAliPayAdapterService implements CDrivingPayService{ + + @Autowired + OrderFactory orderFactory; + + @Autowired + private MaUtil maUtil; + + @Override + public PayAdapterResult pay(WxPayAccount payAccount,WxPayOrder record,WxComposeOrder composeOrder,List childOrders, + String productName,EnumPayShare isShare,WxAppinfo appInfo,Date currentDate, PayExtraParam params) throws Exception { + + return null; + } + + @Override + public PayAdapterResult createPay(ProductOrderPay orderPay, WxAppinfo appInfo, WxPayAccount payAccount) throws Exception { + + AlipayClient alipayClient = maUtil.getAliPayClient(appInfo, payAccount); + AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); + //异步接收地址,仅支持http/https,公网可访问 + request.setNotifyUrl(payAccount.getNotifyUrl() + "/aliNotify"); + //同步跳转地址,仅支持http/https +// request.setReturnUrl(""); + /******必传参数******/ + JSONObject bizContent = new JSONObject(); + //商户订单号,商家自定义,保持唯一性 + bizContent.put("out_trade_no", orderPay.getOrderNumber()); + //支付金额,最小值0.01元 + bizContent.put("total_amount", orderPay.getPayAmountStr()); + //订单标题,不可使用特殊符号 + bizContent.put("subject", orderPay.getOrderDetail()); + //电脑网站支付场景固定传值FAST_INSTANT_TRADE_PAY + bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY"); + + bizContent.put("qr_pay_mode",1); + + String after15 = DateUtils.date2String(DateUtils.getSecondsTimeAfter(15 * 60, new Date())); + + bizContent.put("time_expire", after15); + + request.setBizContent(bizContent.toString()); + AlipayTradePagePayResponse response = alipayClient.pageExecute(request); + PayAdapterResult par = new PayAdapterResult(); + if(response.isSuccess()){ + if("10000".equals(response.getCode())){ + par.setSuccess(true); + par.setTransactionId(response.getTradeNo()); + par.setData(response); + }else{ + par.setSuccess(false); + par.setMsg(response.getMsg()); + } + } else { + par.setSuccess(false); + } + return par; + } + + @Override + public PayQueryAdapterResult queryPayStatus(WxPayOrder oldRecord, WxAppinfo appInfo, + WxPayAccount payAccount) throws Exception { + return null; + } + + @Override + public PayQueryAdapterResult queryPayStatus(ProductOrderPay orderPay, WxAppinfo appInfo, WxPayAccount payAccount) throws Exception { + return super.queryPayStatus(orderPay,appInfo,payAccount); + } + + @Override + public int queryPayStatus(PayQueryAdapterResult statusObject, String orderOutNo) throws Exception { + return 0; + } + + @Override + public int queryPayStatusCode(WxPayOrder oldRecord, WxAppinfo appInfo, WxPayAccount payAccount) + throws Exception { + return 0; + } + + @Override + public PayAdapterResult payOrderClose(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) throws Exception { + //todo + return super.closeOrder(appInfo, record, payAccount); + } + + @Override + public PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record, WxPayAccount payAccount) + throws Exception { + 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 null; + } + + @Override + public String getScheme(WxAppinfo appinfo, String pageUrl, String sceneParam, Long expireTime) throws Exception { + return null; + } + + @Override + public PayAdapterResult noCreatePay(WxPayOrder record, WxComposeOrder composeOrder, List childOrders) { + return null; + } + + @Override + public void sendSubscribeMsg(WxAppinfo appinfo, WxTemplateMsg wxTemplateMsg, String openId, String toPage, Map param) throws Exception{ + + } + +} diff --git a/suimangService/src/main/java/com/iformall/utils/MaUtil.java b/suimangService/src/main/java/com/iformall/utils/MaUtil.java index 1a3092e..1a3f376 100644 --- a/suimangService/src/main/java/com/iformall/utils/MaUtil.java +++ b/suimangService/src/main/java/com/iformall/utils/MaUtil.java @@ -3,9 +3,14 @@ package com.iformall.utils; import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; +import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayClient; +import com.alipay.api.AlipayConfig; +import com.alipay.api.DefaultAlipayClient; import com.github.binarywang.wxpay.config.WxPayConfig; import com.github.binarywang.wxpay.service.WxPayService; import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; +import com.iformall.common.ErrorCode; import com.iformall.common.FmHttpClientBuilder; import com.iformall.domain.po.WxAppinfo; import com.iformall.domain.po.WxPayAccount; @@ -23,6 +28,7 @@ import com.iformall.douyin.web.api.TtWebService; import com.iformall.douyin.web.api.impl.TtWebServiceImpl; import com.iformall.douyin.web.config.TtWebDefaultConfigImpl; import com.iformall.douyin.web.enums.TtWebApiBeginEnum; +import com.iformall.exception.MallinkException; import com.iformall.mapper.WxAppinfoMapper; import com.iformall.service.WxAppinfoService; import lombok.extern.flogger.Flogger; @@ -56,6 +62,9 @@ public class MaUtil { private static Map webServiceMap = new ConcurrentHashMap(); private static Map webServiceKeyMap = new ConcurrentHashMap(); + + private static Map alipayClientMap = new ConcurrentHashMap(); + private static Map alipayClientKeyMap = new ConcurrentHashMap(); public WxMaService getWeappService(WxAppinfo appinfo) { WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl(); @@ -290,4 +299,36 @@ public class MaUtil { } return service; } + + public AlipayClient getAliPayClient(WxAppinfo appinfo, WxPayAccount payAccount) { + AlipayConfig alipayConfig = new AlipayConfig(); + + alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do"); + alipayConfig.setAppId(appinfo.getAppId()); + alipayConfig.setPrivateKey(appinfo.getSecret()); + alipayConfig.setFormat("json"); + alipayConfig.setCharset("UTF-8"); + alipayConfig.setAlipayPublicKey(payAccount.getMerchantApiKey()); + alipayConfig.setSignType("RSA2"); + + String key = appinfo.getAppId(); + AlipayClient alipayClient = alipayClientMap.get(key); + if(alipayClient == null){ + synchronized("getAliPayClientBlock"+appinfo.getAppId()) { + alipayClient = alipayClientMap.get(key); + if (null == alipayClient) { + try { + alipayClient = new DefaultAlipayClient(alipayConfig); + alipayClientMap.put(key, alipayClient); + } catch (AlipayApiException e) { + e.printStackTrace(); + } + } + } + } + if(alipayClient == null){ + throw new MallinkException(ErrorCode.APP_PLAT_ERROR.getCode(),"获取支付配置失败"); + } + return alipayClient; + } }