支付宝登录

This commit is contained in:
Guoqs
2024-06-11 16:30:42 +08:00
parent 0aef83548c
commit d30be0215e
13 changed files with 202 additions and 127 deletions

View File

@@ -131,10 +131,11 @@ public class MemberController extends BaseController {
/** /**
* 支付寶一键登录 * 支付寶一键登录
* http://localhost:8080/uniapp/member/wechatLogin * http://localhost:8080/uniapp/member/alipayLogin
*/ */
@PostMapping("/alipayLogin") @PostMapping("/alipayLogin")
public RestApiResponse<?> alipayLogin(HttpServletRequest request, @RequestBody WechatLoginDTO dto) { public RestApiResponse<?> alipayLogin(HttpServletRequest request, @RequestBody AlipayLoginDTO dto) {
logger.info("支付宝小程序登录param:{}", JSON.toJSONString(dto));
RestApiResponse<?> response = null; RestApiResponse<?> response = null;
try { try {
// 获取小程序appid // 获取小程序appid
@@ -144,7 +145,7 @@ public class MemberController extends BaseController {
response = new RestApiResponse<>(ImmutableMap.of("memberToken", memberToken)); response = new RestApiResponse<>(ImmutableMap.of("memberToken", memberToken));
} catch (Exception e) { } catch (Exception e) {
logger.error("支付宝登录异常 param:{}", JSON.toJSONString(dto), e); logger.error("支付宝登录异常 param:{}", JSON.toJSONString(dto), e);
response = new RestApiResponse<>(ReturnCodeEnum.CODE_WECHAT_LOGIN_ERROR); response = new RestApiResponse<>(ReturnCodeEnum.CODE_ALIPAY_LOGIN_ERROR);
} }
return response; return response;
} }
@@ -199,21 +200,21 @@ public class MemberController extends BaseController {
* 获取openId * 获取openId
* http://localhost:8080/uniapp/member/getOpenId * http://localhost:8080/uniapp/member/getOpenId
*/ */
@PostMapping("/getOpenId") // @PostMapping("/getOpenId")
public RestApiResponse<?> getOpenId(HttpServletRequest request, @RequestBody WeixinPayDTO dto) { // public RestApiResponse<?> getOpenId(HttpServletRequest request, @RequestBody WeixinPayDTO dto) {
logger.info("获取openId param:{}", dto.toString()); // logger.info("获取openId param:{}", dto.toString());
RestApiResponse<?> response; // RestApiResponse<?> response;
try { // try {
getMemberIdByAuthorization(request); // getMemberIdByAuthorization(request);
String openId = memberService.getOpenIdByCode(dto.getCode()); // String openId = memberService.getOpenIdByCode(dto.getCode());
response = new RestApiResponse<>(ImmutableMap.of("openId", openId)); // response = new RestApiResponse<>(ImmutableMap.of("openId", openId));
} catch (Exception e) { // } catch (Exception e) {
logger.error("获取openId error", e); // logger.error("获取openId error", e);
response = new RestApiResponse<>(ReturnCodeEnum.CODE_GET_OPEN_ID_BY_CODE_ERROR); // response = new RestApiResponse<>(ReturnCodeEnum.CODE_GET_OPEN_ID_BY_CODE_ERROR);
} // }
logger.info("获取openId result:{}", response); // logger.info("获取openId result:{}", response);
return response; // return response;
} // }
/** /**

View File

@@ -61,47 +61,47 @@ public class PayController extends BaseController {
* http://localhost:8080/uniapp/pay/weixinPay * http://localhost:8080/uniapp/pay/weixinPay
* @deprecated 使用汇付支付,充值余额 * @deprecated 使用汇付支付,充值余额
*/ */
@PostMapping("/weixinPay") // @PostMapping("/weixinPay")
public RestApiResponse<?> weixinPay(HttpServletRequest request, @RequestBody WeixinPayDTO dto) { // public RestApiResponse<?> weixinPay(HttpServletRequest request, @RequestBody WeixinPayDTO dto) {
logger.info("微信支付 param:{}", dto.toString()); // logger.info("微信支付 param:{}", dto.toString());
RestApiResponse<?> response; // RestApiResponse<?> response;
try { // try {
if (dto != null) { // if (dto != null) {
throw new BusinessException("00500005", "充值功能维护,已有余额可用,推荐使用在线支付"); // throw new BusinessException("00500005", "充值功能维护,已有余额可用,推荐使用在线支付");
} // }
if (StringUtils.isBlank(dto.getCode()) || StringUtils.isBlank(dto.getAmount())) { // if (StringUtils.isBlank(dto.getCode()) || StringUtils.isBlank(dto.getAmount())) {
throw new BusinessException(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR); // throw new BusinessException(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR);
} // }
// 鉴权 // // 鉴权
String memberId = getMemberIdByAuthorization(request); // String memberId = getMemberIdByAuthorization(request);
if (StringUtils.isBlank(memberId)) { // if (StringUtils.isBlank(memberId)) {
throw new BusinessException(ReturnCodeEnum.CODE_TOKEN_ERROR); // throw new BusinessException(ReturnCodeEnum.CODE_TOKEN_ERROR);
} // }
dto.setMemberId(memberId); // dto.setMemberId(memberId);
// String openId = memberService.getOpenIdByCode(dto.getCode()); // // String openId = memberService.getOpenIdByCode(dto.getCode());
MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMemberId(memberId); // MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMemberId(memberId);
if (memberBasicInfo == null) { // if (memberBasicInfo == null) {
throw new BusinessException(ReturnCodeEnum.CODE_GET_OPEN_ID_BY_CODE_ERROR); // throw new BusinessException(ReturnCodeEnum.CODE_GET_OPEN_ID_BY_CODE_ERROR);
} // }
String openId = memberBasicInfo.getOpenId(); // String openId = memberBasicInfo.getOpenId();
dto.setOpenId(openId); // dto.setOpenId(openId);
// 充值余额 附加参数 // // 充值余额 附加参数
PaymentScenarioDTO paymentScenarioDTO = new PaymentScenarioDTO(); // PaymentScenarioDTO paymentScenarioDTO = new PaymentScenarioDTO();
paymentScenarioDTO.setType(ScenarioEnum.BALANCE.getValue()); // paymentScenarioDTO.setType(ScenarioEnum.BALANCE.getValue());
paymentScenarioDTO.setMemberId(memberId); // paymentScenarioDTO.setMemberId(memberId);
dto.setAttach(JSON.toJSONString(paymentScenarioDTO)); // dto.setAttach(JSON.toJSONString(paymentScenarioDTO));
dto.setDescription("会员充值余额"); // dto.setDescription("会员充值余额");
Map<String, Object> weixinMap = orderService.weixinPayV3(dto); // Map<String, Object> weixinMap = orderService.weixinPayV3(dto);
response = new RestApiResponse<>(ImmutableMap.of("weixinMap", weixinMap)); // response = new RestApiResponse<>(ImmutableMap.of("weixinMap", weixinMap));
} catch (BusinessException e) { // } catch (BusinessException e) {
logger.warn("充值余额支付warn", e); // logger.warn("充值余额支付warn", e);
response = new RestApiResponse<>(e.getCode(), e.getMessage()); // response = new RestApiResponse<>(e.getCode(), e.getMessage());
} catch (Exception e) { // } catch (Exception e) {
logger.warn("充值余额支付error", e); // logger.warn("充值余额支付error", e);
response = new RestApiResponse<>(); // response = new RestApiResponse<>();
} // }
return response; // return response;
} // }
/** /**
* 7002 支付订单 * 7002 支付订单

View File

@@ -4,6 +4,7 @@ import cn.hutool.core.util.PageUtil;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference; import com.alibaba.fastjson2.TypeReference;
import com.alipay.easysdk.factory.Factory;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
@@ -13,6 +14,7 @@ import com.huifu.adapay.model.Payment;
import com.jsowell.adapay.common.CreateAdaPaymentParam; import com.jsowell.adapay.common.CreateAdaPaymentParam;
import com.jsowell.adapay.config.AbstractAdapayConfig; import com.jsowell.adapay.config.AbstractAdapayConfig;
import com.jsowell.adapay.factory.AdapayConfigFactory; import com.jsowell.adapay.factory.AdapayConfigFactory;
import com.jsowell.alipay.service.AliAppletRemoteService;
import com.jsowell.common.constant.CacheConstants; import com.jsowell.common.constant.CacheConstants;
import com.jsowell.common.constant.Constants; import com.jsowell.common.constant.Constants;
import com.jsowell.common.constant.UserConstants; import com.jsowell.common.constant.UserConstants;
@@ -76,6 +78,9 @@ public class MemberService {
@Autowired @Autowired
private WxAppletRemoteService wxAppletRemoteService; private WxAppletRemoteService wxAppletRemoteService;
@Autowired
private AliAppletRemoteService aliAppletRemoteService;
@Autowired @Autowired
private MemberPlateNumberRelationService memberPlateNumberRelationService; private MemberPlateNumberRelationService memberPlateNumberRelationService;
@@ -146,9 +151,12 @@ public class MemberService {
if (StringUtils.isBlank(firstLevelMerchantId)) { if (StringUtils.isBlank(firstLevelMerchantId)) {
throw new BusinessException(ReturnCodeEnum.CODE_GET_MERCHANT_ID_BY_APP_ID_ERROR); throw new BusinessException(ReturnCodeEnum.CODE_GET_MERCHANT_ID_BY_APP_ID_ERROR);
} }
if (StringUtils.isBlank(openId)) {
throw new BusinessException(ReturnCodeEnum.CODE_OPEN_ID_IS_NULL_ERROR); // 2024年6月11日15点37分 支付宝没有openid改为不校验openid
} // if (StringUtils.isBlank(openId)) {
// throw new BusinessException(ReturnCodeEnum.CODE_OPEN_ID_IS_NULL_ERROR);
// }
// 查询手机号码是否注册过 // 查询手机号码是否注册过
MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMobileNumber(phoneNumber, firstLevelMerchantId); MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMobileNumber(phoneNumber, firstLevelMerchantId);
if (Objects.isNull(memberBasicInfo)) { if (Objects.isNull(memberBasicInfo)) {
@@ -160,7 +168,9 @@ public class MemberService {
memberBasicInfo.setNickName("会员" + memberId); memberBasicInfo.setNickName("会员" + memberId);
memberBasicInfo.setMobileNumber(phoneNumber); memberBasicInfo.setMobileNumber(phoneNumber);
memberBasicInfo.setMerchantId(Long.valueOf(firstLevelMerchantId)); memberBasicInfo.setMerchantId(Long.valueOf(firstLevelMerchantId));
if (StringUtils.isBlank(openId)) {
memberBasicInfo.setOpenId(openId); memberBasicInfo.setOpenId(openId);
}
MemberTransactionDTO memberTransactionDTO = new MemberTransactionDTO(); MemberTransactionDTO memberTransactionDTO = new MemberTransactionDTO();
memberTransactionDTO.setMemberBasicInfo(memberBasicInfo); memberTransactionDTO.setMemberBasicInfo(memberBasicInfo);
@@ -208,26 +218,28 @@ public class MemberService {
if (StringUtils.isBlank(mobileNumber)) { if (StringUtils.isBlank(mobileNumber)) {
throw new BusinessException(ReturnCodeEnum.CODE_GET_MOBILE_NUMBER_BY_CODE_ERROR); throw new BusinessException(ReturnCodeEnum.CODE_GET_MOBILE_NUMBER_BY_CODE_ERROR);
} }
// 通过appid获取运营商id
// String merchantId = pileMerchantInfoService.getMerchantIdByAppId(dto.getAppId());
// if (Objects.isNull(merchantId)) {
// throw new BusinessException(ReturnCodeEnum.CODE_GET_MERCHANT_ID_BY_APP_ID_ERROR);
// }
// 通过code获取openId // 通过code获取openId
String openId = ""; String openId = "";
try { try {
openId = getOpenIdByCode(dto.getOpenIdCode()); openId = wxAppletRemoteService.getOpenIdByCode(dto.getOpenIdCode());
} catch (Exception e) { } catch (Exception e) {
log.error("getOpenIdByCode发生异常", e); log.error("getOpenIdByCode发生异常", e);
} }
// 根据appid查询merchantId // 根据appid查询merchantId
String firstLevelMerchantId = pileMerchantInfoService.getFirstLevelMerchantIdByAppId(APP_ID); String firstLevelMerchantId = pileMerchantInfoService.getFirstLevelMerchantIdByAppId(dto.getAppId());
// 查询手机号码是否注册过 // 查询手机号码是否注册过
return memberRegisterAndLogin(mobileNumber, firstLevelMerchantId, openId); return memberRegisterAndLogin(mobileNumber, firstLevelMerchantId, openId);
} }
public String alipayLogin(WechatLoginDTO dto) { public String alipayLogin(AlipayLoginDTO dto) throws Exception {
return ""; // 通过密文解密 获取手机号码
String mobileNumber = Factory.Util.AES().decrypt(dto.getMobileNumberCiphertext());
// 根据appid查询merchantId
String firstLevelMerchantId = pileMerchantInfoService.getFirstLevelMerchantIdByAppId(dto.getAppId());
// 查询手机号码是否注册过
return memberRegisterAndLogin(mobileNumber, firstLevelMerchantId, "");
} }
/** /**
@@ -235,9 +247,9 @@ public class MemberService {
* @param code * @param code
* @return * @return
*/ */
public String getOpenIdByCode(String code) { // public String getOpenIdByCode(String code) {
return wxAppletRemoteService.getOpenIdByCode(code); // return wxAppletRemoteService.getOpenIdByCode(code);
} // }
/** /**
* 处理用户信息 * 处理用户信息

View File

@@ -208,3 +208,5 @@ alipay:
alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt5iUV9VA5EDCMFZlxMlZ2NHvkPdwmRwTzN1rNGlf/VITTBvt1F61nQBjTlUIDVxvd77Zs9bS4bA/k2rpo0luDRQeSSgZ5xHDA6A0E4gcwik54s/Ic6DIWGpod/Ci6sSLpq8Fn9/jnR4k12sr4fzQOANdwwnlEtrynLa7j94IWeXeIqXFenLamswqvvwSuMWsVzxub/gXpjeY5t6pzRKxFoh9Cpf6e2lMP3vP8thr+kSYH/37OWndJZw0I1FW+aZzLmERCA/T4wK7u4tVIeLK9xlKGtV1CHki8PjRAazXWEXmoN7dtFGTi5xBBkHof38CVAe94QOn4XSwyegiyA5A3QIDAQAB alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt5iUV9VA5EDCMFZlxMlZ2NHvkPdwmRwTzN1rNGlf/VITTBvt1F61nQBjTlUIDVxvd77Zs9bS4bA/k2rpo0luDRQeSSgZ5xHDA6A0E4gcwik54s/Ic6DIWGpod/Ci6sSLpq8Fn9/jnR4k12sr4fzQOANdwwnlEtrynLa7j94IWeXeIqXFenLamswqvvwSuMWsVzxub/gXpjeY5t6pzRKxFoh9Cpf6e2lMP3vP8thr+kSYH/37OWndJZw0I1FW+aZzLmERCA/T4wK7u4tVIeLK9xlKGtV1CHki8PjRAazXWEXmoN7dtFGTi5xBBkHof38CVAe94QOn4XSwyegiyA5A3QIDAQAB
# 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数必须外网可以正常访问 # 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数必须外网可以正常访问
notifyUrl: xxxx notifyUrl: xxxx
# AES密钥
encryptKey: 0TOgnthQKQtoXJaSn5Bbhg==

View File

@@ -203,3 +203,5 @@ alipay:
alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt5iUV9VA5EDCMFZlxMlZ2NHvkPdwmRwTzN1rNGlf/VITTBvt1F61nQBjTlUIDVxvd77Zs9bS4bA/k2rpo0luDRQeSSgZ5xHDA6A0E4gcwik54s/Ic6DIWGpod/Ci6sSLpq8Fn9/jnR4k12sr4fzQOANdwwnlEtrynLa7j94IWeXeIqXFenLamswqvvwSuMWsVzxub/gXpjeY5t6pzRKxFoh9Cpf6e2lMP3vP8thr+kSYH/37OWndJZw0I1FW+aZzLmERCA/T4wK7u4tVIeLK9xlKGtV1CHki8PjRAazXWEXmoN7dtFGTi5xBBkHof38CVAe94QOn4XSwyegiyA5A3QIDAQAB alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt5iUV9VA5EDCMFZlxMlZ2NHvkPdwmRwTzN1rNGlf/VITTBvt1F61nQBjTlUIDVxvd77Zs9bS4bA/k2rpo0luDRQeSSgZ5xHDA6A0E4gcwik54s/Ic6DIWGpod/Ci6sSLpq8Fn9/jnR4k12sr4fzQOANdwwnlEtrynLa7j94IWeXeIqXFenLamswqvvwSuMWsVzxub/gXpjeY5t6pzRKxFoh9Cpf6e2lMP3vP8thr+kSYH/37OWndJZw0I1FW+aZzLmERCA/T4wK7u4tVIeLK9xlKGtV1CHki8PjRAazXWEXmoN7dtFGTi5xBBkHof38CVAe94QOn4XSwyegiyA5A3QIDAQAB
# 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数必须外网可以正常访问 # 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数必须外网可以正常访问
notifyUrl: xxxx notifyUrl: xxxx
# AES密钥
encryptKey: 0TOgnthQKQtoXJaSn5Bbhg==

View File

@@ -203,3 +203,5 @@ alipay:
alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt5iUV9VA5EDCMFZlxMlZ2NHvkPdwmRwTzN1rNGlf/VITTBvt1F61nQBjTlUIDVxvd77Zs9bS4bA/k2rpo0luDRQeSSgZ5xHDA6A0E4gcwik54s/Ic6DIWGpod/Ci6sSLpq8Fn9/jnR4k12sr4fzQOANdwwnlEtrynLa7j94IWeXeIqXFenLamswqvvwSuMWsVzxub/gXpjeY5t6pzRKxFoh9Cpf6e2lMP3vP8thr+kSYH/37OWndJZw0I1FW+aZzLmERCA/T4wK7u4tVIeLK9xlKGtV1CHki8PjRAazXWEXmoN7dtFGTi5xBBkHof38CVAe94QOn4XSwyegiyA5A3QIDAQAB alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt5iUV9VA5EDCMFZlxMlZ2NHvkPdwmRwTzN1rNGlf/VITTBvt1F61nQBjTlUIDVxvd77Zs9bS4bA/k2rpo0luDRQeSSgZ5xHDA6A0E4gcwik54s/Ic6DIWGpod/Ci6sSLpq8Fn9/jnR4k12sr4fzQOANdwwnlEtrynLa7j94IWeXeIqXFenLamswqvvwSuMWsVzxub/gXpjeY5t6pzRKxFoh9Cpf6e2lMP3vP8thr+kSYH/37OWndJZw0I1FW+aZzLmERCA/T4wK7u4tVIeLK9xlKGtV1CHki8PjRAazXWEXmoN7dtFGTi5xBBkHof38CVAe94QOn4XSwyegiyA5A3QIDAQAB
# 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数必须外网可以正常访问 # 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数必须外网可以正常访问
notifyUrl: xxxx notifyUrl: xxxx
# AES密钥
encryptKey: 0TOgnthQKQtoXJaSn5Bbhg==

View File

@@ -206,3 +206,5 @@ alipay:
alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt5iUV9VA5EDCMFZlxMlZ2NHvkPdwmRwTzN1rNGlf/VITTBvt1F61nQBjTlUIDVxvd77Zs9bS4bA/k2rpo0luDRQeSSgZ5xHDA6A0E4gcwik54s/Ic6DIWGpod/Ci6sSLpq8Fn9/jnR4k12sr4fzQOANdwwnlEtrynLa7j94IWeXeIqXFenLamswqvvwSuMWsVzxub/gXpjeY5t6pzRKxFoh9Cpf6e2lMP3vP8thr+kSYH/37OWndJZw0I1FW+aZzLmERCA/T4wK7u4tVIeLK9xlKGtV1CHki8PjRAazXWEXmoN7dtFGTi5xBBkHof38CVAe94QOn4XSwyegiyA5A3QIDAQAB alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt5iUV9VA5EDCMFZlxMlZ2NHvkPdwmRwTzN1rNGlf/VITTBvt1F61nQBjTlUIDVxvd77Zs9bS4bA/k2rpo0luDRQeSSgZ5xHDA6A0E4gcwik54s/Ic6DIWGpod/Ci6sSLpq8Fn9/jnR4k12sr4fzQOANdwwnlEtrynLa7j94IWeXeIqXFenLamswqvvwSuMWsVzxub/gXpjeY5t6pzRKxFoh9Cpf6e2lMP3vP8thr+kSYH/37OWndJZw0I1FW+aZzLmERCA/T4wK7u4tVIeLK9xlKGtV1CHki8PjRAazXWEXmoN7dtFGTi5xBBkHof38CVAe94QOn4XSwyegiyA5A3QIDAQAB
# 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数必须外网可以正常访问 # 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数必须外网可以正常访问
notifyUrl: xxxx notifyUrl: xxxx
# AES密钥
encryptKey: 0TOgnthQKQtoXJaSn5Bbhg==

View File

@@ -1,7 +1,11 @@
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipayEncrypt;
import com.alipay.easysdk.base.oauth.models.AlipaySystemOauthTokenResponse; import com.alipay.easysdk.base.oauth.models.AlipaySystemOauthTokenResponse;
import com.alipay.easysdk.factory.Factory; import com.alipay.easysdk.factory.Factory;
import com.aliyun.tea.TeaUnretryableException; import com.aliyun.tea.TeaUnretryableException;
@@ -259,21 +263,38 @@ public class SpringBootTestController {
private NotificationService notificationService; private NotificationService notificationService;
@Test @Test
public void alipayLoginTest() { public void decryptPhoneNum(){
String refreshToken = ""; // 前端接口返回的加密信息
String auth_code = "354109ecc25f4d9f943331578f56XD91"; String response ="{\"response\":\"CunEGSbDxsQaKllc35Q+4lJdLiprZhrHFt9erZriETVHv2IrtZsmC8cA6DE5l8GgzvgHCPdGp1iUJQhNyKog==\",\"sign\":\"BlmgjdRvvifS1d9LGcVzq66P7vYrpRHrSCY1SX8zDfU4vEiN4Kz9otxGA4Hz6vG0SoBdlg+Nc58JVUP1IXzQUIFrvAYLC2Uty9J60RmvyWjUf+1Njt7ifX5JgqhMPGOoz3H1OQ1NiqjT6L93KTHYjLt8q37U1aTBO72lQQRgSk0Yf+z1RbalBgRLXHYrgQNORoqJZNN4emQ0a63B30FAFbbko1JbR5eToLK2EcT7vG5rN7wH+3XGTeQ0em81ryNXYUjf7sKLDTsPu7Irk3okOiWMVUr83d3wkST9JWjnO5H7Advh0DaHA1aQnT9oKm82lcUA0r9eE8kqfTmuQ==\"}";
//1. 获取解密所需要的参数
Map<String, String> openapiResult = com.alibaba.fastjson.JSON.parseObject(response, new TypeReference<Map<String, String>>() {}, Feature.OrderedField);
String charset = "UTF-8";
String encryptType = "AES";
String content = openapiResult.get("response");
// 判断是否为加密内容
boolean isDataEncrypted = !content.startsWith("{");
String decryptKey = "B_AES_KEY"; // 商家小程序 AES 密钥
//AES密钥这里参数不能写成固定的开发阶段需传入模板的AES密钥实例化后应传入商家小程序的AES密钥
// 解密
String plainData = null;
if (isDataEncrypted) {
try { try {
// AlipaySystemOauthTokenResponse alipaySystemOauthTokenResponse = Factory.Base.OAuth().refreshToken(refreshToken); System.out.println("AlipayEncrypt");
// System.out.println(JSON.toJSONString(alipaySystemOauthTokenResponse)); plainData = AlipayEncrypt.decryptContent(content, encryptType, decryptKey,charset);
AlipaySystemOauthTokenResponse token = Factory.Base.OAuth().getToken(auth_code); System.out.println("AlipayEncrypt Trance done");
System.out.println(JSON.toJSONString(token)); } catch (AlipayApiException e) {
} catch (Exception e) { //解密异常, 记录日志
if (e instanceof TeaUnretryableException) { try {
TeaUnretryableException exception = (TeaUnretryableException) e; throw new Exception("解密异常");
logger.error("TeaUnretryableException异常:{}", exception.getLastRequest()); } catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} }
logger.error("Exception", e);
} }
} else {
plainData = content;
}
System.out.println(plainData);
} }
@Test @Test
@@ -2892,18 +2913,18 @@ public class SpringBootTestController {
@Test @Test
public void testPay() { public void testPay() {
String code = "081zIoGa11GamE0iVVIa1aaJ4G0zIoGE"; // String code = "081zIoGa11GamE0iVVIa1aaJ4G0zIoGE";
String openId = memberService.getOpenIdByCode(code); // String openId = memberService.getOpenIdByCode(code);
Map<String, Object> pay = null; // Map<String, Object> pay = null;
try { // try {
WeixinPayDTO dto = new WeixinPayDTO(); // WeixinPayDTO dto = new WeixinPayDTO();
dto.setOpenId(openId); // dto.setOpenId(openId);
dto.setAmount("0.01"); // dto.setAmount("0.01");
pay = orderService.weixinPayV3(dto); // pay = orderService.weixinPayV3(dto);
} catch (Exception e) { // } catch (Exception e) {
e.printStackTrace(); // e.printStackTrace();
} // }
System.out.println(JSON.toJSONString(pay)); // System.out.println(JSON.toJSONString(pay));
} }
@Test @Test

View File

@@ -24,6 +24,8 @@ public enum ReturnCodeEnum {
CODE_WECHAT_LOGIN_ERROR("00100008", "微信登录异常"), CODE_WECHAT_LOGIN_ERROR("00100008", "微信登录异常"),
CODE_GET_MEMBER_PHONE_NUMBER_ERROR("00100009", "获取用户手机号异常"), CODE_GET_MEMBER_PHONE_NUMBER_ERROR("00100009", "获取用户手机号异常"),
CODE_HANDLE_USER_INFO_ERROR("00100010", "处理用户信息异常"), CODE_HANDLE_USER_INFO_ERROR("00100010", "处理用户信息异常"),
@@ -137,6 +139,8 @@ public enum ReturnCodeEnum {
CODE_GET_MEMBER_CAR_NO_INFO_ERROR("00100064", "通过 memberId 查询用户绑定车牌信息失败"), CODE_GET_MEMBER_CAR_NO_INFO_ERROR("00100064", "通过 memberId 查询用户绑定车牌信息失败"),
CODE_ALIPAY_LOGIN_ERROR("00100065", "支付宝登录异常"),
/* 个人桩 start */ /* 个人桩 start */
CODE_PILE_HAS_BEEN_BINDING_ERROR("00400001", "此桩已被绑定,请联系管理员!"), CODE_PILE_HAS_BEEN_BINDING_ERROR("00400001", "此桩已被绑定,请联系管理员!"),

View File

@@ -28,6 +28,9 @@ public class AliPayConfig implements CommandLineRunner {
@Value("${alipay.notifyUrl}") @Value("${alipay.notifyUrl}")
private String notifyUrl; private String notifyUrl;
@Value("${alipay.encryptKey}")
private String encryptKey;
@Override @Override
public void run(String... args) throws Exception { public void run(String... args) throws Exception {
log.info(">>>>>>>>>>>>>>>服务启动执行,执行加载数据等操作 AliPayConfig order 2 <<<<<<<<<<<<<"); log.info(">>>>>>>>>>>>>>>服务启动执行,执行加载数据等操作 AliPayConfig order 2 <<<<<<<<<<<<<");
@@ -50,8 +53,9 @@ public class AliPayConfig implements CommandLineRunner {
config.alipayPublicKey = alipayPublicKey; config.alipayPublicKey = alipayPublicKey;
// 可设置异步通知接收服务地址(可选) // 可设置异步通知接收服务地址(可选)
// config.notifyUrl = "<-- 请填写您的支付类接口异步通知接收服务地址例如https://www.test.com/callback -->"; // config.notifyUrl = "<-- 请填写您的支付类接口异步通知接收服务地址例如https://www.test.com/callback -->";
// 可设置AES密钥调用AES加解密相关接口时需要可选 // 可设置AES密钥调用AES加解密相关接口时需要可选
// config.encryptKey = "<-- 请填写您的AES密钥例如aa4BtZ4tspm2wnXLb1ThQA== -->"; config.encryptKey = encryptKey;
Factory.setOptions(config); Factory.setOptions(config);
} }
} }

View File

@@ -1,16 +1,21 @@
package com.jsowell.alipay.service; package com.jsowell.alipay.service;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient; import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayConfig; import com.alipay.api.AlipayConfig;
import com.alipay.api.DefaultAlipayClient; import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipayEncrypt;
import com.alipay.api.request.AlipaySystemOauthTokenRequest; import com.alipay.api.request.AlipaySystemOauthTokenRequest;
import com.alipay.api.response.AlipaySystemOauthTokenResponse; import com.alipay.easysdk.base.oauth.models.AlipaySystemOauthTokenResponse;
import com.alipay.easysdk.factory.Factory; import com.alipay.easysdk.factory.Factory;
import com.jsowell.alipay.config.AliPayConfig; import com.jsowell.alipay.config.AliPayConfig;
import com.jsowell.common.enums.ykc.ReturnCodeEnum; import com.jsowell.common.enums.ykc.ReturnCodeEnum;
import com.jsowell.common.exception.BusinessException; import com.jsowell.common.exception.BusinessException;
import com.jsowell.common.response.RestApiResponse; import com.jsowell.common.response.RestApiResponse;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -22,36 +27,34 @@ import java.util.Map;
/** /**
* 支付宝小程序service * 支付宝小程序service
*/ */
@Slf4j
@Service @Service
public class AliAppletRemoteService { public class AliAppletRemoteService {
private Logger log = LoggerFactory.getLogger(AliAppletRemoteService.class); /**
* 通过authCode获取手机号
* @param code
* @return
* @throws Exception
*/
public String getMobileNumberByCode(String code) throws Exception {
AlipaySystemOauthTokenResponse token = Factory.Base.OAuth().getToken(code);
log.info("AlipaySystemOauthTokenResponse:{}", JSON.toJSONString(token));
String accessToken = token.getAccessToken();
// Factory.Util.AES().decrypt();
return "";
}
/** /**
* (支付宝) 换取授权访问令牌 * 通过openIdCode获取openId
* alipay.system.oauth.token(换取授权访问令牌) * @param openIdCode
* @return * @return
*/ */
@RequestMapping("getInfo") public String getOpenId(String openIdCode) {
public RestApiResponse<?> getInfo(String auth_code) throws AlipayApiException { return "";
RestApiResponse<?> restApiResponse;
try {
if(auth_code==null||auth_code.length()==0) {
throw new BusinessException(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR);
} }
Map<String,Object> map=new HashMap<>();
map.put("userid", "");
restApiResponse = new RestApiResponse<>(map);
} catch (BusinessException e) {
restApiResponse = new RestApiResponse<>(e.getCode(), e.getMessage());
} catch (Exception e) {
restApiResponse = new RestApiResponse<>(ReturnCodeEnum.CODE_FAILED);
}
return restApiResponse;
}
} }

View File

@@ -0,0 +1,16 @@
package com.jsowell.pile.dto;
import lombok.Data;
@Data
public class AlipayLoginDTO {
/**
* 手机号密文
*/
private String mobileNumberCiphertext;
/**
* 小程序appId
*/
private String appId;
}

View File

@@ -7,8 +7,14 @@ import lombok.Data;
*/ */
@Data @Data
public class WechatLoginDTO { public class WechatLoginDTO {
/**
* 前端获取到的authCode
*/
private String code; private String code;
/**
* 小程序appId
*/
private String appId; private String appId;
/** /**