Просмотр исходного кода

fix alipay

release_toaliyun_real
xiaohanzi 5 лет назад
Родитель
Сommit
5ef1555fae
30 измененных файлов: 808 добавлений и 75 удалений
  1. +1
    -0
      mallinkAdmin/src/main/resources/application-dev.yml
  2. +1
    -0
      mallinkAdmin/src/main/resources/application-prod.yml
  3. +4
    -1
      mallinkAdmin/src/main/resources/db/migration/V202104150001__alipay.sql
  4. +1
    -0
      mallinkBApi/src/main/resources/application-dev.yml
  5. +1
    -0
      mallinkBApi/src/main/resources/application-prod.yml
  6. +53
    -56
      mallinkCApi/src/main/java/com/iformall/controller/AliPayController.java
  7. +1
    -0
      mallinkCApi/src/main/resources/application-dev.yml
  8. +1
    -0
      mallinkCApi/src/main/resources/application-prod.yml
  9. +122
    -0
      mallinkCallback/src/main/java/com/iformall/controller/callback/AliPayController.java
  10. +1
    -0
      mallinkCallback/src/main/resources/application-dev.yml
  11. +1
    -0
      mallinkCallback/src/main/resources/application-prod.yml
  12. +38
    -0
      mallinkService/src/main/java/com/iformall/domain/po/AliPayCUser.java
  13. +6
    -0
      mallinkService/src/main/java/com/iformall/domain/po/WxMall.java
  14. +15
    -0
      mallinkService/src/main/java/com/iformall/mapper/AliPayCUserMapper.java
  15. +28
    -0
      mallinkService/src/main/java/com/iformall/service/AliPayCUserService.java
  16. +57
    -0
      mallinkService/src/main/java/com/iformall/service/impl/AliPayCUserServiceImpl.java
  17. +97
    -9
      mallinkService/src/main/java/com/iformall/service/pay/alipay/AliPayUtil.java
  18. +100
    -4
      mallinkService/src/main/java/com/iformall/service/pay/alipay/api/AliPayApi.java
  19. +37
    -0
      mallinkService/src/main/java/com/iformall/service/pay/alipay/api/enums/EnumMemberCardConfig.java
  20. +1
    -1
      mallinkService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelColumn.java
  21. +1
    -1
      mallinkService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelFieldRule.java
  22. +1
    -1
      mallinkService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelRequest.java
  23. +1
    -1
      mallinkService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelStyle.java
  24. +10
    -0
      mallinkService/src/main/java/com/iformall/service/pay/alipay/api/result/UserAuthData.java
  25. +1
    -0
      mallinkService/src/main/java/com/iformall/service/pay/alipay/config/AliPayConfig.java
  26. +79
    -0
      mallinkService/src/main/resources/mapper/AliPayCUserMapper.xml
  27. +3
    -1
      mallinkService/src/main/resources/mapper/WxMallMapper.xml
  28. +127
    -0
      mallinkSysAdmin/src/main/java/com/iformall/controller/pay/AlipayController.java
  29. +10
    -0
      mallinkSysAdmin/src/main/resources/application-dev.yml
  30. +9
    -0
      mallinkSysAdmin/src/main/resources/application-prod.yml

+ 1
- 0
mallinkAdmin/src/main/resources/application-dev.yml Просмотреть файл

@@ -165,6 +165,7 @@ alipay:
appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt
alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt
alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt
callback:https://callbacktest.malls.iformall.com/api/alipay/notify/callback




jasypt: jasypt:


+ 1
- 0
mallinkAdmin/src/main/resources/application-prod.yml Просмотреть файл

@@ -125,6 +125,7 @@ alipay:
appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt
alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt
alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt
callback:https://callbacktest.malls.iformall.com/api/alipay/notify/callback


fm: fm:
exception: true exception: true


+ 4
- 1
mallinkAdmin/src/main/resources/db/migration/V202104150001__alipay.sql Просмотреть файл

@@ -1,5 +1,8 @@
ALTER TABLE `wx_mall` ALTER TABLE `wx_mall`
ADD COLUMN `cash_out_support` INT(1) COMMENT '是否支持商户提现(不开启分账才有效) 0-不支持 1-支持' AFTER `live_support`;
ADD COLUMN `alipay_app_auth_token` VARCHAR(60) COMMENT '支付宝app authToken,永久有效';

ALTER TABLE `wx_mall`
ADD COLUMN `alipay_member_template_id` VARCHAR(40) COMMENT '支付宝会员卡模板编号';


UPDATE wx_mall SET cash_out_support = 0 ; UPDATE wx_mall SET cash_out_support = 0 ;




+ 1
- 0
mallinkBApi/src/main/resources/application-dev.yml Просмотреть файл

@@ -161,6 +161,7 @@ alipay:
appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt
alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt
alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt
callback:https://callbacktest.malls.iformall.com/api/alipay/notify/callback


fm: fm:
exception: true exception: true


+ 1
- 0
mallinkBApi/src/main/resources/application-prod.yml Просмотреть файл

@@ -117,6 +117,7 @@ alipay:
appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt
alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt
alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt
callback:https://callbacktest.malls.iformall.com/api/alipay/notify/callback


fm: fm:
exception: true exception: true


+ 53
- 56
mallinkCApi/src/main/java/com/iformall/controller/AliPayController.java Просмотреть файл

@@ -1,82 +1,79 @@
package com.iformall.controller; package com.iformall.controller;


import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
import cn.binarywang.wx.miniapp.util.crypt.WxMaCryptUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.iformall.annotation.AuthIgnore;
import com.iformall.annotation.TenantIgnore;
import com.github.pagehelper.PageInfo;
import com.iformall.common.ErrorCode; import com.iformall.common.ErrorCode;
import com.iformall.common.Result; import com.iformall.common.Result;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.domain.po.*;
import com.iformall.domain.po.base.TenantEntity;
import com.iformall.domain.vo.WxCUserVo;
import com.iformall.domain.vo.WxLevelMerchantCVo;
import com.iformall.enums.*;
import com.iformall.service.*;
import com.iformall.service.wechat.FmOpenService;
import com.iformall.utils.Constant;
import com.iformall.utils.IPUtil;
import com.iformall.utils.RedisCacheUtils;
import com.iformall.domain.po.WxActivity;
import com.iformall.domain.po.WxMall;
import com.iformall.domain.po.base.BaseEntity;
import com.iformall.enums.EnumActivityEnrollStatus;
import com.iformall.enums.EnumActivityStatus;
import com.iformall.exception.MallinkException;
import com.iformall.service.WxActivityService;
import com.iformall.service.WxMallService;
import com.iformall.service.pay.alipay.AliPayUtil;
import com.iformall.utils.DateUtils;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import me.chanjar.weixin.common.error.WxErrorException;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;


/**
* @author gongbiao
*/
@RestController @RestController
@RequestMapping("/api/alipay") @RequestMapping("/api/alipay")
@Api(description = "支付宝相关接口,包括支付宝用户端操作回调接口")
public class AliPayController extends BaseController {
@Api(description = "活动")
public class AlipayController extends BaseController {
private final Logger logger = LoggerFactory.getLogger(this.getClass()); private final Logger logger = LoggerFactory.getLogger(this.getClass());


@Autowired @Autowired
private WxCUserService wxCUserService;



private WxMallService wxMallService;
@Autowired
private AliPayUtil alipayUtil;


/**
* 支付宝客户端回调接口
* 1. 商圈授权给isv后的回调。 isv账号登陆开放平台(https://openhome.alipay.com),选择平台应用,菜单“商家授权应用-发起授权”,复制链接或二维码给商圈支付宝账号扫。
* 2.用户在同意领取支付宝会员卡之后的回调。
* @param response
* @param request
* @throws IOException
*/
@AuthIgnore
@RequestMapping(value = "/callback")
@ResponseBody
public void signature(HttpServletResponse response, HttpServletRequest request) throws IOException {
@ApiOperation("分页列表接口")
@GetMapping("getMemberPage")
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
public ResultData getMemberPage(@ModelAttribute WxActivity wxActivity, Integer pageNum, Integer pageSize) {
WxMall wxMall = wxMallService.getByTenantInfo(getTenantInfo());
if (null == wxMall ) {
return new ResultData(Result.ERROR,"wxMall不存在");
}
if (StringUtils.isBlank(wxMall.getAlipayAppAuthToken())) {
return new ResultData(Result.ERROR,"wxMall alipayAppToken不存在");
}
String source = request.getParameter("source");
//商家授权给ISV后的回调
if ("alipay_app_auth".equals(source)) {
PrintWriter out = response.getWriter();
out.print("授权成功!");
out.close();
}
if (StringUtils.isBlank(wxMall.getAlipayMemberTemplateId())) {
return new ResultData(Result.ERROR,"wxMall alipayMemberTemplateId不存在");
}
String url = alipayUtil.getSmartDistrictMemberCardUrl(wxMall.getAlipayAppAuthToken(), wxMall.getAlipayMemberTemplateId(), "memberAuth_"+wxMall.getTenantId());
try {
return new ResultData(URLDecoder.decode(url, "utf-8"));
} catch (UnsupportedEncodingException e) {
logger.error("getMemberPage error url["+url+"]",e);
return new ResultData(Result.ERROR,"url返回失败");
}
} }
} }

+ 1
- 0
mallinkCApi/src/main/resources/application-dev.yml Просмотреть файл

@@ -157,6 +157,7 @@ alipay:
appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt
alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt
alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt
callback:https://callbacktest.malls.iformall.com/api/alipay/notify/callback


jasypt: jasypt:
encryptor: encryptor:


+ 1
- 0
mallinkCApi/src/main/resources/application-prod.yml Просмотреть файл

@@ -116,6 +116,7 @@ alipay:
appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt
alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt
alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt
callback:https://callbacktest.malls.iformall.com/api/alipay/notify/callback


fm: fm:
exception: true exception: true


+ 122
- 0
mallinkCallback/src/main/java/com/iformall/controller/callback/AliPayController.java Просмотреть файл

@@ -1,7 +1,12 @@
package com.iformall.controller.callback; package com.iformall.controller.callback;


import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.iformall.common.IdWorker;
import com.iformall.common.Result;
import com.iformall.common.ResultData;
import com.iformall.controller.base.BaseController; import com.iformall.controller.base.BaseController;
import com.iformall.domain.po.AliPayCUser;
import com.iformall.domain.po.WxMall;
import com.iformall.domain.po.msg.FmInsideNotifyPaySuccessMsg; import com.iformall.domain.po.msg.FmInsideNotifyPaySuccessMsg;
import com.iformall.domain.po.msg.FmInsideNotifyRefundSuccessMsg; import com.iformall.domain.po.msg.FmInsideNotifyRefundSuccessMsg;
import com.iformall.enums.*; import com.iformall.enums.*;
@@ -9,12 +14,18 @@ import com.iformall.exception.BizMessageException;
import com.iformall.exception.MallinkException; import com.iformall.exception.MallinkException;
import com.iformall.mq.MqBaseProducer; import com.iformall.mq.MqBaseProducer;
import com.iformall.pay.WxPayment; import com.iformall.pay.WxPayment;
import com.iformall.service.AliPayCUserService;
import com.iformall.service.WxMallService;
import com.iformall.service.WxPayOrderService; import com.iformall.service.WxPayOrderService;
import com.iformall.service.WxRefundOrderService; import com.iformall.service.WxRefundOrderService;
import com.iformall.service.WxSubsidyService; import com.iformall.service.WxSubsidyService;
import com.iformall.service.pay.alipay.AliPayUtil;
import com.iformall.service.pay.alipay.api.enums.EnumMemberCardConfig;
import com.iformall.service.pay.alipay.api.result.UserAuthData;
import com.iformall.utils.XmlUtil; import com.iformall.utils.XmlUtil;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.jdom2.JDOMException; import org.jdom2.JDOMException;
import org.junit.platform.commons.util.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -26,9 +37,12 @@ import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;


import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.PrintWriter;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.Map; import java.util.Map;
import java.util.SortedMap; import java.util.SortedMap;
@@ -50,7 +64,115 @@ public class AliPayController extends BaseController {
private MqBaseProducer mqBaseProducer; private MqBaseProducer mqBaseProducer;
@Autowired
private AliPayUtil alipayUtil;
@Autowired
private WxMallService mallService;
@Autowired
private AliPayCUserService aliPayCUserService;
/**
* 支付宝客户端回调接口
* 1. 商圈授权给isv后的回调。 isv账号登陆开放平台(https://openhome.alipay.com),选择平台应用,菜单“商家授权应用-发起授权”,复制链接或二维码给商圈支付宝账号扫。
* 2.用户在同意领取支付宝会员卡之后的回调。
* @param response
* @param request
* @throws IOException
*/
@RequestMapping(value = "/callback")
@ResponseBody
public void signature(HttpServletResponse response, HttpServletRequest request) throws IOException {
String source = request.getParameter("source");
String scope = request.getParameter("scope");
String outString = request.getParameter("outString");
if (null == outString) {
outString = "";
}
PrintWriter out = response.getWriter();
//商家授权给ISV后的回调
if ("alipay_app_auth".equals(source)) {
String tenantId = request.getParameter("state");
if (StringUtils.isBlank(tenantId)) {
out.print("参数错误!tenantId为空.");
}else {
WxMall wxMall = mallService.getByTenantId(tenantId);
if (null == wxMall ) {
out.print("参数错误!wxMall未查询到.");
}else {
String appAuthCode = request.getParameter("app_auth_code");
if (StringUtils.isBlank(appAuthCode)) {
out.print("参数错误!app_auth_code为空.");
}else {
String token = alipayUtil.getAppAuthToken(appAuthCode);
if (StringUtils.isBlank(token)) {
out.print("授权始飙,token为空,请重新再试!.");
}else {
wxMall.setAlipayAppAuthToken(token);
mallService.update(wxMall);
out.print("授权成功!.");
}
}
}
}
//用户端授权行为
}else if (outString.startsWith("memberAuth")) {
String authCode = request.getParameter("auth_code");
String requestId = request.getParameter("request_id");
String templateId = request.getParameter("template_id");
String[] args = outString.split("_");
String tenantId = args[1];
WxMall wxMall = mallService.getByTenantId(tenantId);
if (null == wxMall ) {
out.print("参数错误!wxMall未查询到.");
}
if (null == wxMall.getAlipayAppAuthToken() || "".equals(wxMall.getAlipayAppAuthToken()) ) {
out.print("参数错误!wxMall alipayAppToken为空.");
}else {
UserAuthData authData = alipayUtil.queryUserAuthData(wxMall.getAlipayAppAuthToken(), authCode);
if (null == authData ) {
out.print("获取用户授权令牌错误!queryUserAuthData返回信息为空.");
}else {
Map<EnumMemberCardConfig,Object> map = alipayUtil.queryUserFormData(wxMall.getAlipayAppAuthToken(), authData.getAccessToken(), templateId, requestId);
if (null == map) {
out.print("获取用户表单信息错误!queryUserFormData返回信息为空.");
}else {
String phone = (String) map.get(EnumMemberCardConfig.OPEN_FORM_FIELD_MOBILE);
if (StringUtils.isBlank(phone)) {
out.print("获取用户表单信息错误!手机号为空.");
}else {
//查询该userId是否已经开卡,已经开卡不再开卡
AliPayCUser query = new AliPayCUser();
query.setAlipayUserId(authData.getUserId());
query.updateTenantInfo(wxMall);
AliPayCUser alicuser = aliPayCUserService.getByAliPayUserId(query);
if (null == alicuser) {
//添加用户信息
alicuser = new AliPayCUser();
alicuser.setAlipayUserId(authData.getUserId());
alicuser.setPhone(phone);
alicuser.updateTenantInfo(wxMall);
aliPayCUserService.saveOrUpdate(alicuser);
}
if (null != alicuser.getCardOpen() && alicuser.getCardOpen() > 0) {
out.print("用户授权成功!.");
}else {
boolean opencard = alipayUtil.openCard(wxMall.getAlipayAppAuthToken(), authData.getAccessToken(), templateId, authData.getUserId());
if (opencard) {
alicuser.setCardOpen(1);
aliPayCUserService.saveOrUpdate(alicuser);
out.print("用户授权成功!.");
}else {
out.print("用户授权失败!.");
}
}
}
}
}
}
}
out.close();
}
/** /**
*ISV_GATEWAY_URL?charset=GBK&biz_content= *ISV_GATEWAY_URL?charset=GBK&biz_content=


+ 1
- 0
mallinkCallback/src/main/resources/application-dev.yml Просмотреть файл

@@ -163,6 +163,7 @@ alipay:
appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt
alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt
alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt
callback:https://callbacktest.malls.iformall.com/api/alipay/notify/callback


jasypt: jasypt:
encryptor: encryptor:


+ 1
- 0
mallinkCallback/src/main/resources/application-prod.yml Просмотреть файл

@@ -121,6 +121,7 @@ alipay:
appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt
alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt
alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt
callback:https://callbacktest.malls.iformall.com/api/alipay/notify/callback


fm: fm:
exception: true exception: true


+ 38
- 0
mallinkService/src/main/java/com/iformall/domain/po/AliPayCUser.java Просмотреть файл

@@ -0,0 +1,38 @@
package com.iformall.domain.po;

import java.util.Date;

import com.baomidou.mybatisplus.annotation.TableName;
import com.iformall.domain.po.base.TenantEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;


@TableName(value = "alipay_c_user")
@Data
@EqualsAndHashCode(callSuper = true)
public class AliPayCUser extends TenantEntity {

/**
*
*/
private static final long serialVersionUID = 1L;

@io.swagger.annotations.ApiModelProperty(value="编号",name="id")
protected Long id;

@io.swagger.annotations.ApiModelProperty(value="支付宝userId",name="alipayUserId")
private String alipayUserId;
@io.swagger.annotations.ApiModelProperty(value="电话",name="phone")
private String phone;
@io.swagger.annotations.ApiModelProperty(value="是否已开卡 0-为开卡 1-已开卡",name="cardOpen")
private Integer cardOpen;
@io.swagger.annotations.ApiModelProperty(value="关联的会员编号",name="userId")
private Long userId;
@io.swagger.annotations.ApiModelProperty(value="用户名",name="name")
private String name;
@io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate")
private Date createDate;
@io.swagger.annotations.ApiModelProperty(value="更新时间",name="updateDate")
private Date updateDate;
}

+ 6
- 0
mallinkService/src/main/java/com/iformall/domain/po/WxMall.java Просмотреть файл

@@ -90,6 +90,12 @@ public class WxMall extends TenantEntity {
private Integer cashOutSupport; private Integer cashOutSupport;
@io.swagger.annotations.ApiModelProperty(value="商户提现每日次数限制",name="cashOutLimit") @io.swagger.annotations.ApiModelProperty(value="商户提现每日次数限制",name="cashOutLimit")
private Integer cashOutLimit; private Integer cashOutLimit;
@io.swagger.annotations.ApiModelProperty(value="支付宝app authToken,永久有效",name="alipayAppAuthToken")
private String alipayAppAuthToken;
@io.swagger.annotations.ApiModelProperty(value="支付宝app authToken,永久有效",name="alipayAppAuthToken")
private String alipayMemberTemplateId;


@TableField(exist = false) @TableField(exist = false)
protected List<WxMallBuilding> buildings; protected List<WxMallBuilding> buildings;


+ 15
- 0
mallinkService/src/main/java/com/iformall/mapper/AliPayCUserMapper.java Просмотреть файл

@@ -0,0 +1,15 @@
package com.iformall.mapper;

import java.util.List;

import com.iformall.common.CommonMapper;
import com.iformall.domain.po.AliPayCUser;

public interface AliPayCUserMapper extends CommonMapper<AliPayCUser, Long> {
List<AliPayCUser> findList(AliPayCUser alipayCUser);
AliPayCUser findByAliPayUserId(AliPayCUser record);
void updateUserId(AliPayCUser user);
}

+ 28
- 0
mallinkService/src/main/java/com/iformall/service/AliPayCUserService.java Просмотреть файл

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

import com.github.pagehelper.PageInfo;
import com.iformall.domain.po.AliPayCUser;
public interface AliPayCUserService {

/**
* 根据实体查询分页列表
*
* @param record
* @param pageIndex
* @param pageSize
* @return
*/
PageInfo<AliPayCUser> listAsPage(AliPayCUser record, Integer pageIndex, Integer pageSize);

/**
* 根据openId获得实体
*
* @param record
* @return
*/
AliPayCUser getByAliPayUserId(AliPayCUser record);

void updateUserId(AliPayCUser user);
void saveOrUpdate(AliPayCUser user);
}

+ 57
- 0
mallinkService/src/main/java/com/iformall/service/impl/AliPayCUserServiceImpl.java Просмотреть файл

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

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.iformall.common.IdWorker;
import com.iformall.domain.po.*;
import com.iformall.domain.po.base.BaseCUserEntity;
import com.iformall.mapper.AliPayCUserMapper;
import com.iformall.service.*;

import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class AliPayCUserServiceImpl implements AliPayCUserService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
AliPayCUserMapper aliPayCUserMapper;

@Autowired
@Qualifier("baseCUserTokenRedisTemplate")
RedisTemplate<String, BaseCUserEntity> baseCUserTokenRedisTemplate;

@Override
public PageInfo<AliPayCUser> listAsPage(AliPayCUser record, Integer pageIndex, Integer pageSize) {
return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> aliPayCUserMapper.findList(record));
}

@Override
public AliPayCUser getByAliPayUserId(AliPayCUser record) {
return aliPayCUserMapper.findByAliPayUserId(record);
}

@Override
public void updateUserId(AliPayCUser user) {
aliPayCUserMapper.updateUserId(user);
}

@Override
public void saveOrUpdate(AliPayCUser user) {
if (null == user.getId()) {
user.setId(IdWorker.get().nextId());
user.setCreateDate(new Date());
aliPayCUserMapper.insert(user);
}else {
user.setUpdateDate(new Date());
aliPayCUserMapper.updateById(user);
}
}
}

+ 97
- 9
mallinkService/src/main/java/com/iformall/service/pay/alipay/AliPayUtil.java Просмотреть файл

@@ -9,7 +9,10 @@ import java.io.IOException;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID; import java.util.UUID;


import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@@ -24,10 +27,12 @@ import com.alipay.easysdk.base.oauth.models.AlipaySystemOauthTokenResponse;
import com.alipay.easysdk.kernel.Config; import com.alipay.easysdk.kernel.Config;
import com.alipay.easysdk.util.generic.models.AlipayOpenApiGenericResponse; import com.alipay.easysdk.util.generic.models.AlipayOpenApiGenericResponse;
import com.iformall.service.pay.alipay.api.AliPayApi; import com.iformall.service.pay.alipay.api.AliPayApi;
import com.iformall.service.pay.alipay.api.entity.memberCardModel.AlipayMemberCardModelColumn;
import com.iformall.service.pay.alipay.api.entity.memberCardModel.AlipayMemberCardModelFieldRule;
import com.iformall.service.pay.alipay.api.entity.memberCardModel.AlipayMemberCardModelRequest;
import com.iformall.service.pay.alipay.api.entity.memberCardModel.AlipayMemberCardModelStyle;
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 com.iformall.service.pay.alipay.config.AliPayConfig;


import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -50,6 +55,22 @@ public class AliPayUtil {
payConfig.getAlipayCertPath(), payConfig.getAlipayRootCertPath()); 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 //查询app_auth_token
public String getAppAuthToken(String appAuthCode) { public String getAppAuthToken(String appAuthCode) {
try { try {
@@ -167,7 +188,8 @@ public class AliPayUtil {
public boolean setSmartDistrictMemberCardModelConfig(String appAuthToken,String templateId) { public boolean setSmartDistrictMemberCardModelConfig(String appAuthToken,String templateId) {
try { try {
AlipayOpenApiGenericResponse response = AliPayApi.setMemberCardModelConfig(getConfig(),appAuthToken, templateId, AlipayOpenApiGenericResponse response = AliPayApi.setMemberCardModelConfig(getConfig(),appAuthToken, templateId,
new String[] {"OPEN_FORM_FIELD_MOBILE","OPEN_FORM_FIELD_NAME"},new String[] {"OPEN_FORM_FIELD_GENDER"});
new String[] {EnumMemberCardConfig.OPEN_FORM_FIELD_MOBILE.getCode(),EnumMemberCardConfig.OPEN_FORM_FIELD_NAME.getCode()}
,new String[] {EnumMemberCardConfig.OPEN_FORM_FIELD_GENDER.getCode()});
JSONObject result = getGenericResponse(response.getHttpBody(),"alipay_marketing_card_formtemplate_set_response"); JSONObject result = getGenericResponse(response.getHttpBody(),"alipay_marketing_card_formtemplate_set_response");
if (null != result) { if (null != result) {
return true; return true;
@@ -179,9 +201,9 @@ public class AliPayUtil {
} }
//获取商圈会员卡领卡投放链接 //获取商圈会员卡领卡投放链接
public String getSmartDistrictMemberCardUrl(String appAuthToken,String templateId,String appCallback,String param) {
public String getSmartDistrictMemberCardUrl(String appAuthToken,String templateId,String param) {
try { try {
AlipayOpenApiGenericResponse response = AliPayApi.getMemberCardUrl(getConfig(),appAuthToken, templateId, param, appCallback);
AlipayOpenApiGenericResponse response = AliPayApi.getMemberCardUrl(getConfig(),appAuthToken, templateId, param, getCallBack());
JSONObject result = getGenericResponse(response.getHttpBody(),"alipay_marketing_card_activateurl_apply_response"); JSONObject result = getGenericResponse(response.getHttpBody(),"alipay_marketing_card_activateurl_apply_response");
if (null != result) { if (null != result) {
return result.getString("apply_card_url"); return result.getString("apply_card_url");
@@ -193,15 +215,81 @@ public class AliPayUtil {
} }
//商圈智能积分授权(算法授权)URL //商圈智能积分授权(算法授权)URL
public String getH5SmartDistrictMallVipPointsUrl(String appId,String callback,String param) {
public String getH5SmartDistrictMallVipPointsUrl(String appId,String param) {
try { try {
return "https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id="+appId+"&scope=mall_vip_points&redirect_uri="+URLEncoder.encode(callback,"utf-8")+"&state="+param;
return "https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id="+appId+"&scope=mall_vip_points&redirect_uri="+URLEncoder.encode(getCallBack(),"utf-8")+"&state="+param;
} catch (UnsupportedEncodingException e) { } catch (UnsupportedEncodingException e) {
log.error("alipay getH5MallVipPointsUrl error. ",e); log.error("alipay getH5MallVipPointsUrl error. ",e);
} }
return null; 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");
if (null != result) {
UserAuthData authData = new UserAuthData();
authData.setUserId(result.getString("user_id"));
authData.setAccessToken(result.getString("access_token"));
return authData;
}
} 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);
String[] keys = (String[]) jo.keySet().toArray();
EnumMemberCardConfig config = EnumMemberCardConfig.getEnum(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) { public boolean smartDistrictTopicSubscribe(String appAuthToken) {
try { try {


+ 100
- 4
mallinkService/src/main/java/com/iformall/service/pay/alipay/api/AliPayApi.java Просмотреть файл

@@ -1,5 +1,8 @@
package com.iformall.service.pay.alipay.api; 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.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -14,10 +17,11 @@ import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config; import com.alipay.easysdk.kernel.Config;
import com.alipay.easysdk.util.generic.models.AlipayOpenApiGenericResponse; import com.alipay.easysdk.util.generic.models.AlipayOpenApiGenericResponse;
import com.iformall.common.IdWorker; import com.iformall.common.IdWorker;
import com.iformall.service.pay.alipay.api.entity.memberCardModel.AlipayMemberCardModelColumn;
import com.iformall.service.pay.alipay.api.entity.memberCardModel.AlipayMemberCardModelFieldRule;
import com.iformall.service.pay.alipay.api.entity.memberCardModel.AlipayMemberCardModelRequest;
import com.iformall.service.pay.alipay.api.entity.memberCardModel.AlipayMemberCardModelStyle;
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 * SDK说明 https://opendocs.alipay.com/open/54/00y8k9
@@ -64,6 +68,19 @@ public class AliPayApi {
return config; 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/open/common/105193
* https://opendocs.alipay.com/apis/api_9/alipay.open.auth.token.app * https://opendocs.alipay.com/apis/api_9/alipay.open.auth.token.app
@@ -193,6 +210,85 @@ public class AliPayApi {
return response; 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);

//设置业务参数(OpenAPI中biz_content里的参数)
Map<String, Object> bizParams = new HashMap<String, Object>();
bizParams.put("grant_type", "authorization_code");
bizParams.put("authorization_code", authCode);
AlipayOpenApiGenericResponse response = Factory.Util.Generic().execute(
"alipay.system.oauth.token", textParams, bizParams);
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));
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 * https://opendocs.alipay.com/apis/api_9/alipay.open.app.message.topic.subscribe
* 订阅消息主题 * 订阅消息主题


+ 37
- 0
mallinkService/src/main/java/com/iformall/service/pay/alipay/api/enums/EnumMemberCardConfig.java Просмотреть файл

@@ -0,0 +1,37 @@
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;
}
}

mallinkService/src/main/java/com/iformall/service/pay/alipay/api/entity/memberCardModel/AlipayMemberCardModelColumn.java → mallinkService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelColumn.java Просмотреть файл

@@ -1,4 +1,4 @@
package com.iformall.service.pay.alipay.api.entity.memberCardModel;
package com.iformall.service.pay.alipay.api.reqEntity;


import com.aliyun.tea.TeaModel; import com.aliyun.tea.TeaModel;



mallinkService/src/main/java/com/iformall/service/pay/alipay/api/entity/memberCardModel/AlipayMemberCardModelFieldRule.java → mallinkService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelFieldRule.java Просмотреть файл

@@ -1,4 +1,4 @@
package com.iformall.service.pay.alipay.api.entity.memberCardModel;
package com.iformall.service.pay.alipay.api.reqEntity;


import com.aliyun.tea.TeaModel; import com.aliyun.tea.TeaModel;



mallinkService/src/main/java/com/iformall/service/pay/alipay/api/entity/memberCardModel/AlipayMemberCardModelRequest.java → mallinkService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelRequest.java Просмотреть файл

@@ -1,4 +1,4 @@
package com.iformall.service.pay.alipay.api.entity.memberCardModel;
package com.iformall.service.pay.alipay.api.reqEntity;


import java.util.List; import java.util.List;



mallinkService/src/main/java/com/iformall/service/pay/alipay/api/entity/memberCardModel/AlipayMemberCardModelStyle.java → mallinkService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelStyle.java Просмотреть файл

@@ -1,4 +1,4 @@
package com.iformall.service.pay.alipay.api.entity.memberCardModel;
package com.iformall.service.pay.alipay.api.reqEntity;


import com.aliyun.tea.TeaModel; import com.aliyun.tea.TeaModel;



+ 10
- 0
mallinkService/src/main/java/com/iformall/service/pay/alipay/api/result/UserAuthData.java Просмотреть файл

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

import lombok.Data;

@Data
public class UserAuthData {

private String userId;
private String accessToken;
}

+ 1
- 0
mallinkService/src/main/java/com/iformall/service/pay/alipay/config/AliPayConfig.java Просмотреть файл

@@ -17,5 +17,6 @@ public class AliPayConfig {
private String appPublicKeyCertPath; private String appPublicKeyCertPath;
private String alipayCertPath; private String alipayCertPath;
private String alipayRootCertPath; private String alipayRootCertPath;
private String callback;


} }

+ 79
- 0
mallinkService/src/main/resources/mapper/AliPayCUserMapper.xml Просмотреть файл

@@ -0,0 +1,79 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.iformall.mapper.AliPayCUserMapper">
<resultMap id="BaseResultMap" type="com.iformall.domain.po.AliPayCUser">
<id column="id" jdbcType="BIGINT" property="id"/>
<result column="tenant_id" jdbcType="VARCHAR" property="tenantId"/>
<result column="parent_tenant_id" jdbcType="VARCHAR" property="parentTenantId"/>
<result column="name" jdbcType="VARCHAR" property="name"/>
<result column="alipay_user_id" jdbcType="VARCHAR" property="alipayUserId"/>
<result column="phone" jdbcType="VARCHAR" property="phone"/>
<result column="card_open" jdbcType="INTEGER" property="cardOpen"/>
<result column="user_id" jdbcType="BIGINT" property="userId"/>
<result column="update_date" jdbcType="TIMESTAMP" property="updateDate"/>
<result column="create_date" jdbcType="TIMESTAMP" property="createDate"/>
</resultMap>

<sql id="allColumns">
`id`,`tenant_id`,`parent_tenant_id`,`name`,`alipay_user_id`,`phone`,`card_open`,`user_id`,`update_date`,`create_date`
</sql>

<sql id="dynamicWhereConditions">
where 1=1

<if test=" null != id ">
and `id` = #{id}
</if>

<if test=" null != tenantId and '' != tenantId">
and `tenant_id` = #{tenantId}
</if>
<if test=" null != parentTenantId and '' != parentTenantId">
and `parent_tenant_id` = #{parentTenantId}
</if>

<if test=" null != name ">
and `name` like concat('%', #{name},'%')
</if>

<if test=" null != alipayUserId ">
and `alipay_user_id` = #{alipayUserId}
</if>

<if test=" null != phone ">
and `phone` = #{phone}
</if>

<if test=" null != userId ">
and `user_id` = #{userId}
</if>

<if test=" null != ids ">
and id in
<foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")">
#{idItem}
</foreach>
</if>
<if test=" null != sortColumns">order by ${sortColumns}</if>
</sql>

<select id="findList" parameterType="com.iformall.domain.po.AliPayCUser" resultMap="BaseResultMap">
select
<include refid="allColumns"/>
from alipay_c_user
<include refid="dynamicWhereConditions"/>
and id &gt; 1
</select>


<select id="findByAliPayUserId" parameterType="com.iformall.domain.po.AliPayCUser" resultMap="BaseResultMap">
select <include refid="allColumns"/> from alipay_c_user
where `alipay_user_id` = #{alipayUserId} and `tenant_id` = #{tenantId}
</select>
<update id="updateUserId" parameterType="com.iformall.domain.po.AliPayCUser">
update alipay_c_user set user_id=#{userId}
where id = #{id} and `tenant_id` = #{tenantId}
</update>

</mapper>

+ 3
- 1
mallinkService/src/main/resources/mapper/WxMallMapper.xml Просмотреть файл

@@ -38,6 +38,8 @@
<result column="live_support" jdbcType="INTEGER" property="liveSupport"/> <result column="live_support" jdbcType="INTEGER" property="liveSupport"/>
<result column="cash_out_support" jdbcType="INTEGER" property="cashOutSupport"/> <result column="cash_out_support" jdbcType="INTEGER" property="cashOutSupport"/>
<result column="cash_out_limit" jdbcType="INTEGER" property="cashOutLimit"/> <result column="cash_out_limit" jdbcType="INTEGER" property="cashOutLimit"/>
<result column="alipay_app_auth_token" jdbcType="VARCHAR" property="alipayAppAuthToken"/>
<result column="alipay_member_template_id" jdbcType="VARCHAR" property="alipayMemberTemplateId"/>
</resultMap> </resultMap>


<sql id="allColumns"> <sql id="allColumns">
@@ -46,7 +48,7 @@
`img_url`,`img_url_h`, `weap_note`, `img_qrcode_weapp`, `img_qrcode_wemp`, `img_url`,`img_url_h`, `weap_note`, `img_qrcode_weapp`, `img_qrcode_wemp`,
`weapp_share_title`,`weapp_share_cover_img`, `pos_qrcode_rule`, `weapp_share_title`,`weapp_share_cover_img`, `pos_qrcode_rule`,
`sale_type`, `valid_start`, `valid_end`,`business_hours`,`introduction`,`img`, `sale_type`, `valid_start`, `valid_end`,`business_hours`,`introduction`,`img`,
`group_support`,`latitude`,`longitude`,`live_support`,`cash_out_support`,`cash_out_limit`
`group_support`,`latitude`,`longitude`,`live_support`,`cash_out_support`,`cash_out_limit`,`alipay_app_auth_token`,`alipay_member_template_id`
</sql> </sql>


<sql id="dynamicWhereConditions"> <sql id="dynamicWhereConditions">


+ 127
- 0
mallinkSysAdmin/src/main/java/com/iformall/controller/pay/AlipayController.java Просмотреть файл

@@ -0,0 +1,127 @@
package com.iformall.controller.pay;

import com.iformall.annotation.SystemControllerLog;
import com.iformall.controller.base.BaseController;
import io.swagger.annotations.Api;

import java.io.IOException;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import com.github.pagehelper.PageInfo;
import com.iformall.common.Result;
import com.iformall.common.ResultData;
import com.iformall.domain.po.WxMall;
import com.iformall.domain.po.WxPayAccount;
import com.iformall.service.WxMallService;
import com.iformall.service.WxPayAccountService;
import com.iformall.service.pay.alipay.AliPayUtil;

import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;

@RestController
@RequestMapping("alipay")
public class AlipayController extends BaseController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
private AliPayUtil aliPayUtil;
@Autowired
private WxMallService mallService;

@ApiOperation("获取应用授权链接")
@GetMapping("getAppAuthUrl")
@ApiImplicitParam(name = "mallId", value = "wx_mall id", dataType = "Long", paramType = "query", required = true)
public ResultData getAppAuthUrl(Long mallId) {
WxMall wxMall = mallService.getById(mallId);
if (null == wxMall ) {
return new ResultData(Result.ERROR,"wxMall未查询到");
}
return new ResultData(aliPayUtil.getAppAuthUrl(wxMall.getTenantId()));
}
@ApiOperation("图片上传")
@PostMapping(value = "/imageUpload", consumes = "multipart/*", headers = "content-type=multipart/form-data")
public ResultData imageUpload(@RequestParam("file") MultipartFile multiReq,@RequestParam Map<String, String> param) {
String tenantId = param.get("tenantId");
if (StringUtils.isBlank(tenantId)) {
return new ResultData(Result.ERROR,"tenantId不能为空");
}
WxMall wxMall = mallService.getByTenantId(tenantId);
if (null == wxMall ) {
return new ResultData(Result.ERROR,"wxMall未查询到");
}
if(StringUtils.isBlank(wxMall.getAlipayAppAuthToken())) {
return new ResultData(Result.ERROR,"wxMall alipayAppAuthToken为空");
}
try {
String imageId = aliPayUtil.merchantImageUpload(wxMall.getAlipayAppAuthToken(), multiReq.getOriginalFilename(), multiReq.getBytes());
if (StringUtils.isBlank(imageId)) {
return new ResultData(Result.ERROR,"imageId 返回空");
}else {
return new ResultData(imageId);
}
} catch (IOException e) {
logger.error("alipay imageUpload error.",e);
return new ResultData(Result.ERROR,"上传错误");
}
}
@ApiOperation("创建商圈会员卡")
@PostMapping(value = "/merchantMemberConfig", consumes = "multipart/*", headers = "content-type=multipart/form-data")
@SystemControllerLog(description = "支付账号-新增")
public ResultData merchantMemberConfig(@RequestBody Map<String, String> param) {
String tenantId = param.get("tenantId");
if (StringUtils.isBlank(tenantId)) {
return new ResultData(Result.ERROR,"tenantId不能为空");
}
WxMall wxMall = mallService.getByTenantId(tenantId);
if (null == wxMall ) {
return new ResultData(Result.ERROR,"wxMall未查询到");
}
if(StringUtils.isBlank(wxMall.getAlipayAppAuthToken())) {
return new ResultData(Result.ERROR,"wxMall alipayAppAuthToken为空");
}
String logoId = param.get("logoId");
if (StringUtils.isBlank(logoId)) {
return new ResultData(Result.ERROR,"logoId不能为空");
}
String backgroundId = param.get("backgroundId");
if (StringUtils.isBlank(backgroundId)) {
return new ResultData(Result.ERROR,"backgroundId不能为空");
}
try {
String templateId = aliPayUtil.createSmartDistrictMemberCardModel(wxMall.getAlipayAppAuthToken(), wxMall.getName()+"会员卡", logoId, backgroundId);
if (StringUtils.isBlank(templateId)) {
return new ResultData(Result.ERROR,"模板创建失败,模板Id返回空[createSmartDistrictMemberCardModel]");
}
boolean result = aliPayUtil.setSmartDistrictMemberCardModelConfig(wxMall.getAlipayAppAuthToken(), templateId);
if (!result) {
return new ResultData(Result.ERROR,"会员卡模板配置失败[setSmartDistrictMemberCardModelConfig]");
}else {
//设置模板编号
wxMall.setAlipayMemberTemplateId(templateId);
mallService.update(wxMall);
return new ResultData();
}
} catch (Exception e) {
logger.error("merchantMemberConfig error.",e);
return new ResultData(Result.ERROR,"merchantMemberConfig error.");
}
}
}

+ 10
- 0
mallinkSysAdmin/src/main/resources/application-dev.yml Просмотреть файл

@@ -151,6 +151,16 @@ wechat:
max-wait: -1 max-wait: -1
min-idle: 10 min-idle: 10


alipay:
open:
appId:"2021002137663024"
appPrivateKey:"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="
appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt
alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt
alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt
callback:https://callbacktest.malls.iformall.com/api/alipay/notify/callback


jasypt: jasypt:
encryptor: encryptor:
password: oRqdnDbK5pj3eMmB password: oRqdnDbK5pj3eMmB


+ 9
- 0
mallinkSysAdmin/src/main/resources/application-prod.yml Просмотреть файл

@@ -115,6 +115,15 @@ wechat:
max-idle: 100 max-idle: 100
max-wait: -1 max-wait: -1
min-idle: 10 min-idle: 10
alipay:
open:
appId:"2021002137663024"
appPrivateKey:"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="
appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt
alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt
alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt
callback:https://callbacktest.malls.iformall.com/api/alipay/notify/callback


fm: fm:
exception: true exception: true


Загрузка…
Отмена
Сохранить