Selaa lähdekoodia

//pay

private_deployment
xhxu 1 vuosi sitten
vanhempi
commit
9ad28071ce
14 muutettua tiedostoa jossa 322 lisäystä ja 886 poistoa
  1. +38
    -0
      suimangCApi/src/main/java/com/iformall/controller/CallbackPayController.java
  2. +5
    -4
      suimangService/pom.xml
  3. +0
    -357
      suimangService/src/main/java/com/iformall/service/pay/alipay/AliPayUtil.java
  4. +0
    -319
      suimangService/src/main/java/com/iformall/service/pay/alipay/api/AliPayApi.java
  5. +0
    -37
      suimangService/src/main/java/com/iformall/service/pay/alipay/api/enums/EnumMemberCardConfig.java
  6. +0
    -21
      suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelColumn.java
  7. +0
    -28
      suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelFieldRule.java
  8. +0
    -52
      suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelRequest.java
  9. +0
    -35
      suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelStyle.java
  10. +0
    -10
      suimangService/src/main/java/com/iformall/service/pay/alipay/api/result/UserAuthData.java
  11. +0
    -23
      suimangService/src/main/java/com/iformall/service/pay/alipay/config/AliPayConfig.java
  12. +93
    -0
      suimangService/src/main/java/com/iformall/service/pay/service/pay/ali/BaseAliPayAdapterService.java
  13. +145
    -0
      suimangService/src/main/java/com/iformall/service/pay/service/pay/ali/page/AliPagePayAdapterService.java
  14. +41
    -0
      suimangService/src/main/java/com/iformall/utils/MaUtil.java

+ 38
- 0
suimangCApi/src/main/java/com/iformall/controller/CallbackPayController.java Näytä tiedosto

@@ -143,4 +143,42 @@ public class CallbackPayController extends BaseController {
return resultMap;
}

@AuthIgnore
@ApiOperation("支付回调")
@PostMapping(value = "/aliNotify")
public Map<String,Object> _aliNotify(@RequestBody Map<String, Object> paranMap, HttpServletRequest request, HttpServletResponse response) {
logger.debug("[" + getIpAddr() + "] CallbackPayController::_aliNotify");
Map<String,Object> resultMap = new HashMap<>();
logger.info("ali支付回调结果通知{}"+JSONObject.toJSONString(paranMap));
/**
* ----效验数据来源合法
*/
try{
// String msg = (String) paranMap.get("msg");
// String type = (String) paranMap.get("type");
//
// Map<String, Object> 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;
}

}

+ 5
- 4
suimangService/pom.xml Näytä tiedosto

@@ -40,11 +40,12 @@
<artifactId>suimang-mybatis</artifactId>
<version>1.0</version>
</dependency>

<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-easysdk</artifactId>
<version>2.2.0</version>
</dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.38.98.ALL</version>
</dependency>
</dependencies>

</project>

+ 0
- 357
suimangService/src/main/java/com/iformall/service/pay/alipay/AliPayUtil.java Näytä tiedosto

@@ -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<AlipayMemberCardModelColumn> columnList = new ArrayList<AlipayMemberCardModelColumn>();
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<AlipayMemberCardModelFieldRule> ruleList = new ArrayList<AlipayMemberCardModelFieldRule>();
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<EnumMemberCardConfig,Object> 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<EnumMemberCardConfig,Object> map = new HashMap<EnumMemberCardConfig,Object>();
for (int i = 0 ; i < infosArray.size(); i++) {
Map<String,Object> jo = (Map<String,Object>)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"));
}
}

+ 0
- 319
suimangService/src/main/java/com/iformall/service/pay/alipay/api/AliPayApi.java Näytä tiedosto

@@ -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<String, String> textParams = new HashMap<String, String>();
//textParams.put("app_auth_token", appAuthToken);
//设置业务参数(OpenAPI中biz_content里的参数)
Map<String, Object> bizParams = new HashMap<String, Object>();
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<String, String> textParams = new HashMap<String, String>();
textParams.put("app_auth_token", appAuthToken);

//设置业务参数(OpenAPI中biz_content里的参数)
Map<String, Object> bizParams = new HashMap<String, Object>();
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<AlipayMemberCardModelColumn> columnList = modelRequest.getColumn_info_list();
bizParams.put("column_info_list", columnList);
List<AlipayMemberCardModelFieldRule> 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<String, String> textParams = new HashMap<String, String>();
textParams.put("app_auth_token", appAuthToken);

//设置业务参数(OpenAPI中biz_content里的参数)
Map<String, Object> bizParams = new HashMap<String, Object>();
bizParams.put("template_id", templateId);
Map<String, String> extendParams = new HashMap<>();
Map<String,String[]> requireds = new HashMap<String,String[]>();
requireds.put("common_fields", requiredFields);
extendParams.put("required", JSON.toJSONString(requireds));
if (null != optionalFields) {
Map<String,String[]> optional = new HashMap<String,String[]>();
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<String, String> textParams = new HashMap<String, String>();
textParams.put("app_auth_token", appAuthToken);

//设置业务参数(OpenAPI中biz_content里的参数)
Map<String, Object> bizParams = new HashMap<String, Object>();
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<String, String> textParams = new HashMap<String, String>();
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<String, String> textParams = new HashMap<String, String>();
textParams.put("app_auth_token", appAuthToken);
textParams.put("auth_token", authToken);

//设置业务参数(OpenAPI中biz_content里的参数)
Map<String, Object> bizParams = new HashMap<String, Object>();
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<String, String> textParams = new HashMap<String, String>();
textParams.put("app_auth_token", appAuthToken);
textParams.put("auth_token", authToken);

//设置业务参数(OpenAPI中biz_content里的参数)
Map<String, Object> bizParams = new HashMap<String, Object>();
IdWorker idWorker = IdWorker.get();
bizParams.put("out_serial_no", String.valueOf(idWorker.nextId()));
bizParams.put("card_template_id", templateId);
Map<String,String> userInfoMap = new HashMap<String,String>();
userInfoMap.put("user_uni_id", userId);
userInfoMap.put("user_uni_id_type", "UID");
bizParams.put("card_user_info", userInfoMap);
Map<String,Object> extInfoMap = new HashMap<String,Object>();
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<String, String> textParams = new HashMap<String, String>();
//textParams.put("app_auth_token", appAuthToken);

//设置业务参数(OpenAPI中biz_content里的参数)
Map<String, Object> bizParams = new HashMap<String, Object>();
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;
}
}

+ 0
- 37
suimangService/src/main/java/com/iformall/service/pay/alipay/api/enums/EnumMemberCardConfig.java Näytä tiedosto

@@ -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;
}
}

+ 0
- 21
suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelColumn.java Näytä tiedosto

@@ -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;
}
}

+ 0
- 28
suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelFieldRule.java Näytä tiedosto

@@ -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;
}
}

+ 0
- 52
suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelRequest.java Näytä tiedosto

@@ -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<AlipayMemberCardModelColumn> column_info_list;//栏位信息
private List<AlipayMemberCardModelFieldRule> 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<AlipayMemberCardModelColumn> getColumn_info_list() {
return column_info_list;
}
public void setColumn_info_list(List<AlipayMemberCardModelColumn> column_info_list) {
this.column_info_list = column_info_list;
}
public List<AlipayMemberCardModelFieldRule> getField_rule_list() {
return field_rule_list;
}
public void setField_rule_list(List<AlipayMemberCardModelFieldRule> field_rule_list) {
this.field_rule_list = field_rule_list;
}
}

+ 0
- 35
suimangService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelStyle.java Näytä tiedosto

@@ -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;
}
}

+ 0
- 10
suimangService/src/main/java/com/iformall/service/pay/alipay/api/result/UserAuthData.java Näytä tiedosto

@@ -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;
}

+ 0
- 23
suimangService/src/main/java/com/iformall/service/pay/alipay/config/AliPayConfig.java Näytä tiedosto

@@ -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;

}

+ 93
- 0
suimangService/src/main/java/com/iformall/service/pay/service/pay/ali/BaseAliPayAdapterService.java Näytä tiedosto

@@ -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<String,Object> 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);
}


}

+ 145
- 0
suimangService/src/main/java/com/iformall/service/pay/service/pay/ali/page/AliPagePayAdapterService.java Näytä tiedosto

@@ -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<WxOrder> 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<WxOrder> childOrders) {
return null;
}

@Override
public void sendSubscribeMsg(WxAppinfo appinfo, WxTemplateMsg wxTemplateMsg, String openId, String toPage, Map<String, String> param) throws Exception{

}

}

+ 41
- 0
suimangService/src/main/java/com/iformall/utils/MaUtil.java Näytä tiedosto

@@ -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<String,TtWebService> webServiceMap = new ConcurrentHashMap<String,TtWebService>();
private static Map<String,String> webServiceKeyMap = new ConcurrentHashMap<String,String>();

private static Map<String,AlipayClient> alipayClientMap = new ConcurrentHashMap<String,AlipayClient>();
private static Map<String,String> alipayClientKeyMap = new ConcurrentHashMap<String,String>();
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;
}
}

Ladataan…
Peruuta
Tallenna