From 5ef1555fae0133391a18e6ba10c4dbc41eafdb8d Mon Sep 17 00:00:00 2001 From: xiaohanzi Date: Mon, 19 Apr 2021 18:45:12 +0800 Subject: [PATCH] fix alipay --- .../src/main/resources/application-dev.yml | 1 + .../src/main/resources/application-prod.yml | 1 + .../db/migration/V202104150001__alipay.sql | 5 +- .../src/main/resources/application-dev.yml | 1 + .../src/main/resources/application-prod.yml | 1 + .../iformall/controller/AliPayController.java | 109 ++++++++------- .../src/main/resources/application-dev.yml | 1 + .../src/main/resources/application-prod.yml | 1 + .../controller/callback/AliPayController.java | 122 +++++++++++++++++ .../src/main/resources/application-dev.yml | 1 + .../src/main/resources/application-prod.yml | 1 + .../com/iformall/domain/po/AliPayCUser.java | 38 ++++++ .../java/com/iformall/domain/po/WxMall.java | 6 + .../iformall/mapper/AliPayCUserMapper.java | 15 +++ .../iformall/service/AliPayCUserService.java | 28 ++++ .../service/impl/AliPayCUserServiceImpl.java | 57 ++++++++ .../service/pay/alipay/AliPayUtil.java | 106 +++++++++++++-- .../service/pay/alipay/api/AliPayApi.java | 104 +++++++++++++- .../api/enums/EnumMemberCardConfig.java | 37 +++++ .../AlipayMemberCardModelColumn.java | 2 +- .../AlipayMemberCardModelFieldRule.java | 2 +- .../AlipayMemberCardModelRequest.java | 2 +- .../AlipayMemberCardModelStyle.java | 2 +- .../pay/alipay/api/result/UserAuthData.java | 10 ++ .../pay/alipay/config/AliPayConfig.java | 1 + .../resources/mapper/AliPayCUserMapper.xml | 79 +++++++++++ .../main/resources/mapper/WxMallMapper.xml | 4 +- .../controller/pay/AlipayController.java | 127 ++++++++++++++++++ .../src/main/resources/application-dev.yml | 10 ++ .../src/main/resources/application-prod.yml | 9 ++ 30 files changed, 808 insertions(+), 75 deletions(-) create mode 100644 mallinkService/src/main/java/com/iformall/domain/po/AliPayCUser.java create mode 100644 mallinkService/src/main/java/com/iformall/mapper/AliPayCUserMapper.java create mode 100644 mallinkService/src/main/java/com/iformall/service/AliPayCUserService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/impl/AliPayCUserServiceImpl.java create mode 100644 mallinkService/src/main/java/com/iformall/service/pay/alipay/api/enums/EnumMemberCardConfig.java rename mallinkService/src/main/java/com/iformall/service/pay/alipay/api/{entity/memberCardModel => reqEntity}/AlipayMemberCardModelColumn.java (86%) rename mallinkService/src/main/java/com/iformall/service/pay/alipay/api/{entity/memberCardModel => reqEntity}/AlipayMemberCardModelFieldRule.java (91%) rename mallinkService/src/main/java/com/iformall/service/pay/alipay/api/{entity/memberCardModel => reqEntity}/AlipayMemberCardModelRequest.java (96%) rename mallinkService/src/main/java/com/iformall/service/pay/alipay/api/{entity/memberCardModel => reqEntity}/AlipayMemberCardModelStyle.java (93%) create mode 100644 mallinkService/src/main/java/com/iformall/service/pay/alipay/api/result/UserAuthData.java create mode 100644 mallinkService/src/main/resources/mapper/AliPayCUserMapper.xml create mode 100644 mallinkSysAdmin/src/main/java/com/iformall/controller/pay/AlipayController.java diff --git a/mallinkAdmin/src/main/resources/application-dev.yml b/mallinkAdmin/src/main/resources/application-dev.yml index c3d4b63dc..aec759e41 100644 --- a/mallinkAdmin/src/main/resources/application-dev.yml +++ b/mallinkAdmin/src/main/resources/application-dev.yml @@ -165,6 +165,7 @@ alipay: 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: diff --git a/mallinkAdmin/src/main/resources/application-prod.yml b/mallinkAdmin/src/main/resources/application-prod.yml index f880aedd1..fe4599b32 100644 --- a/mallinkAdmin/src/main/resources/application-prod.yml +++ b/mallinkAdmin/src/main/resources/application-prod.yml @@ -125,6 +125,7 @@ alipay: 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: exception: true diff --git a/mallinkAdmin/src/main/resources/db/migration/V202104150001__alipay.sql b/mallinkAdmin/src/main/resources/db/migration/V202104150001__alipay.sql index eb4169a85..fb9355731 100644 --- a/mallinkAdmin/src/main/resources/db/migration/V202104150001__alipay.sql +++ b/mallinkAdmin/src/main/resources/db/migration/V202104150001__alipay.sql @@ -1,5 +1,8 @@ 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 ; diff --git a/mallinkBApi/src/main/resources/application-dev.yml b/mallinkBApi/src/main/resources/application-dev.yml index 7bd4cd228..0737bec96 100644 --- a/mallinkBApi/src/main/resources/application-dev.yml +++ b/mallinkBApi/src/main/resources/application-dev.yml @@ -161,6 +161,7 @@ alipay: 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: exception: true diff --git a/mallinkBApi/src/main/resources/application-prod.yml b/mallinkBApi/src/main/resources/application-prod.yml index 07b4192f1..bdc0f5259 100644 --- a/mallinkBApi/src/main/resources/application-prod.yml +++ b/mallinkBApi/src/main/resources/application-prod.yml @@ -117,6 +117,7 @@ alipay: 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: exception: true diff --git a/mallinkCApi/src/main/java/com/iformall/controller/AliPayController.java b/mallinkCApi/src/main/java/com/iformall/controller/AliPayController.java index 974eeb96e..a62cc0a93 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/AliPayController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/AliPayController.java @@ -1,82 +1,79 @@ 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.Result; 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.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import me.chanjar.weixin.common.error.WxErrorException; + 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.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 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.HashMap; -import java.util.List; import java.util.Map; +/** + * @author gongbiao + */ @RestController @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()); @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返回失败"); + } } } diff --git a/mallinkCApi/src/main/resources/application-dev.yml b/mallinkCApi/src/main/resources/application-dev.yml index 7866c880a..8c5cd7fd3 100644 --- a/mallinkCApi/src/main/resources/application-dev.yml +++ b/mallinkCApi/src/main/resources/application-dev.yml @@ -157,6 +157,7 @@ alipay: 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: encryptor: diff --git a/mallinkCApi/src/main/resources/application-prod.yml b/mallinkCApi/src/main/resources/application-prod.yml index 3bf273e7f..53dc2ae37 100644 --- a/mallinkCApi/src/main/resources/application-prod.yml +++ b/mallinkCApi/src/main/resources/application-prod.yml @@ -116,6 +116,7 @@ alipay: 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: exception: true diff --git a/mallinkCallback/src/main/java/com/iformall/controller/callback/AliPayController.java b/mallinkCallback/src/main/java/com/iformall/controller/callback/AliPayController.java index ee9162933..c1f85da95 100644 --- a/mallinkCallback/src/main/java/com/iformall/controller/callback/AliPayController.java +++ b/mallinkCallback/src/main/java/com/iformall/controller/callback/AliPayController.java @@ -1,7 +1,12 @@ package com.iformall.controller.callback; 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.domain.po.AliPayCUser; +import com.iformall.domain.po.WxMall; import com.iformall.domain.po.msg.FmInsideNotifyPaySuccessMsg; import com.iformall.domain.po.msg.FmInsideNotifyRefundSuccessMsg; import com.iformall.enums.*; @@ -9,12 +14,18 @@ import com.iformall.exception.BizMessageException; import com.iformall.exception.MallinkException; import com.iformall.mq.MqBaseProducer; import com.iformall.pay.WxPayment; +import com.iformall.service.AliPayCUserService; +import com.iformall.service.WxMallService; import com.iformall.service.WxPayOrderService; import com.iformall.service.WxRefundOrderService; 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 org.apache.commons.io.IOUtils; import org.jdom2.JDOMException; +import org.junit.platform.commons.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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 javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.PrintWriter; import java.nio.charset.Charset; import java.util.Map; import java.util.SortedMap; @@ -50,7 +64,115 @@ public class AliPayController extends BaseController { 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 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= diff --git a/mallinkCallback/src/main/resources/application-dev.yml b/mallinkCallback/src/main/resources/application-dev.yml index 5ea82ebb7..1f8a13417 100644 --- a/mallinkCallback/src/main/resources/application-dev.yml +++ b/mallinkCallback/src/main/resources/application-dev.yml @@ -163,6 +163,7 @@ alipay: 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: encryptor: diff --git a/mallinkCallback/src/main/resources/application-prod.yml b/mallinkCallback/src/main/resources/application-prod.yml index 01dd1fef6..1ceae1867 100644 --- a/mallinkCallback/src/main/resources/application-prod.yml +++ b/mallinkCallback/src/main/resources/application-prod.yml @@ -121,6 +121,7 @@ alipay: 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: exception: true diff --git a/mallinkService/src/main/java/com/iformall/domain/po/AliPayCUser.java b/mallinkService/src/main/java/com/iformall/domain/po/AliPayCUser.java new file mode 100644 index 000000000..0cfa12390 --- /dev/null +++ b/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; +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxMall.java b/mallinkService/src/main/java/com/iformall/domain/po/WxMall.java index 52985424f..6598022c2 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxMall.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxMall.java @@ -90,6 +90,12 @@ public class WxMall extends TenantEntity { private Integer cashOutSupport; @io.swagger.annotations.ApiModelProperty(value="商户提现每日次数限制",name="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) protected List buildings; diff --git a/mallinkService/src/main/java/com/iformall/mapper/AliPayCUserMapper.java b/mallinkService/src/main/java/com/iformall/mapper/AliPayCUserMapper.java new file mode 100644 index 000000000..2c83e5277 --- /dev/null +++ b/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 { + + List findList(AliPayCUser alipayCUser); + + AliPayCUser findByAliPayUserId(AliPayCUser record); + + void updateUserId(AliPayCUser user); +} diff --git a/mallinkService/src/main/java/com/iformall/service/AliPayCUserService.java b/mallinkService/src/main/java/com/iformall/service/AliPayCUserService.java new file mode 100644 index 000000000..a9df9a502 --- /dev/null +++ b/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 listAsPage(AliPayCUser record, Integer pageIndex, Integer pageSize); + + /** + * 根据openId获得实体 + * + * @param record + * @return + */ + AliPayCUser getByAliPayUserId(AliPayCUser record); + + void updateUserId(AliPayCUser user); + + void saveOrUpdate(AliPayCUser user); +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/AliPayCUserServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/AliPayCUserServiceImpl.java new file mode 100644 index 000000000..26a7de4ef --- /dev/null +++ b/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 baseCUserTokenRedisTemplate; + + @Override + public PageInfo 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); + } + } +} diff --git a/mallinkService/src/main/java/com/iformall/service/pay/alipay/AliPayUtil.java b/mallinkService/src/main/java/com/iformall/service/pay/alipay/AliPayUtil.java index 1441f3456..ab2bd0f28 100644 --- a/mallinkService/src/main/java/com/iformall/service/pay/alipay/AliPayUtil.java +++ b/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.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; @@ -24,10 +27,12 @@ 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.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 lombok.extern.slf4j.Slf4j; @@ -50,6 +55,22 @@ public class AliPayUtil { 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 { @@ -167,7 +188,8 @@ public class AliPayUtil { public boolean setSmartDistrictMemberCardModelConfig(String appAuthToken,String templateId) { try { 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"); if (null != result) { 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 { - 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"); if (null != result) { return result.getString("apply_card_url"); @@ -193,15 +215,81 @@ public class AliPayUtil { } //商圈智能积分授权(算法授权)URL - public String getH5SmartDistrictMallVipPointsUrl(String appId,String callback,String param) { + public String getH5SmartDistrictMallVipPointsUrl(String appId,String param) { 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) { 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"); + 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 queryUserFormData(String appAuthToken,String authToken,String templateId,String requestId) { + try { + AlipayOpenApiGenericResponse response = AliPayApi.queryUserFormData(getConfig(), appAuthToken, authToken, templateId, requestId); + JSONObject result = getGenericResponse(response.getHttpBody(),"alipay_marketing_card_activateform_query_response"); + if (null != result) { + String infos = result.getString("infos"); + if (StringUtils.isBlank(infos)) { + return null; + } + + JSONArray infosArray = JSON.parseArray(infos); + if (null == infosArray) { + return null; + } + Map map = new HashMap(); + for (int i = 0 ; i < infosArray.size(); i++) { + Map jo = (Map)infosArray.get(i); + 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) { try { diff --git a/mallinkService/src/main/java/com/iformall/service/pay/alipay/api/AliPayApi.java b/mallinkService/src/main/java/com/iformall/service/pay/alipay/api/AliPayApi.java index c7711f763..e94146251 100644 --- a/mallinkService/src/main/java/com/iformall/service/pay/alipay/api/AliPayApi.java +++ b/mallinkService/src/main/java/com/iformall/service/pay/alipay/api/AliPayApi.java @@ -1,5 +1,8 @@ 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; @@ -14,10 +17,11 @@ 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.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 @@ -64,6 +68,19 @@ public class AliPayApi { 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 @@ -193,6 +210,85 @@ public class AliPayApi { return response; } + /** + * https://opendocs.alipay.com/apis/api_9/alipay.system.oauth.token + * 会员授权,换取授权访问令牌 + * @return + * @throws Exception + */ + public static AlipayOpenApiGenericResponse queryUserAuthData(Config config,String appAuthToken,String authCode) throws Exception { + Factory.setOptions(config); + //设置系统参数(OpenAPI中非biz_content里的参数) + Map textParams = new HashMap(); + textParams.put("app_auth_token", appAuthToken); + + //设置业务参数(OpenAPI中biz_content里的参数) + Map bizParams = new HashMap(); + 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 textParams = new HashMap(); + textParams.put("app_auth_token", appAuthToken); + textParams.put("auth_token", authToken); + + //设置业务参数(OpenAPI中biz_content里的参数) + Map bizParams = new HashMap(); + bizParams.put("biz_type", "MEMBER_CARD"); + bizParams.put("template_id", templateId); + bizParams.put("request_id", requestId); + AlipayOpenApiGenericResponse response = Factory.Util.Generic().execute( + "alipay.marketing.card.activateform.query", textParams, bizParams); + return response; + } + + /** + * https://opendocs.alipay.com/apis/api_5/alipay.marketing.card.open + * 会员卡开卡 + * @return + * @throws Exception + */ + public static AlipayOpenApiGenericResponse openCard(Config config,String appAuthToken,String authToken,String templateId,String userId) throws Exception { + Factory.setOptions(config); + //设置系统参数(OpenAPI中非biz_content里的参数) + Map textParams = new HashMap(); + textParams.put("app_auth_token", appAuthToken); + textParams.put("auth_token", authToken); + + //设置业务参数(OpenAPI中biz_content里的参数) + Map bizParams = new HashMap(); + IdWorker idWorker = IdWorker.get(); + bizParams.put("out_serial_no", String.valueOf(idWorker.nextId())); + bizParams.put("card_template_id", templateId); + + Map userInfoMap = new HashMap(); + userInfoMap.put("user_uni_id", userId); + userInfoMap.put("user_uni_id_type", "UID"); + bizParams.put("card_user_info", userInfoMap); + + Map extInfoMap = new HashMap(); + extInfoMap.put("open_date", new Date()); + extInfoMap.put("valid_date", DateUtils.stringToDate("2051-05-01 00:00:00",DateUtils.DATE_TIME_PATTERN)); + 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 * 订阅消息主题 diff --git a/mallinkService/src/main/java/com/iformall/service/pay/alipay/api/enums/EnumMemberCardConfig.java b/mallinkService/src/main/java/com/iformall/service/pay/alipay/api/enums/EnumMemberCardConfig.java new file mode 100644 index 000000000..923187206 --- /dev/null +++ b/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; + } +} diff --git a/mallinkService/src/main/java/com/iformall/service/pay/alipay/api/entity/memberCardModel/AlipayMemberCardModelColumn.java b/mallinkService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelColumn.java similarity index 86% rename from mallinkService/src/main/java/com/iformall/service/pay/alipay/api/entity/memberCardModel/AlipayMemberCardModelColumn.java rename to mallinkService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelColumn.java index 6704d7e78..16a569a72 100644 --- a/mallinkService/src/main/java/com/iformall/service/pay/alipay/api/entity/memberCardModel/AlipayMemberCardModelColumn.java +++ b/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; diff --git a/mallinkService/src/main/java/com/iformall/service/pay/alipay/api/entity/memberCardModel/AlipayMemberCardModelFieldRule.java b/mallinkService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelFieldRule.java similarity index 91% rename from mallinkService/src/main/java/com/iformall/service/pay/alipay/api/entity/memberCardModel/AlipayMemberCardModelFieldRule.java rename to mallinkService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelFieldRule.java index 3dd90ff7f..e1847ec89 100644 --- a/mallinkService/src/main/java/com/iformall/service/pay/alipay/api/entity/memberCardModel/AlipayMemberCardModelFieldRule.java +++ b/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; diff --git a/mallinkService/src/main/java/com/iformall/service/pay/alipay/api/entity/memberCardModel/AlipayMemberCardModelRequest.java b/mallinkService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelRequest.java similarity index 96% rename from mallinkService/src/main/java/com/iformall/service/pay/alipay/api/entity/memberCardModel/AlipayMemberCardModelRequest.java rename to mallinkService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelRequest.java index 0ba1ed14a..86d5ffecc 100644 --- a/mallinkService/src/main/java/com/iformall/service/pay/alipay/api/entity/memberCardModel/AlipayMemberCardModelRequest.java +++ b/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; diff --git a/mallinkService/src/main/java/com/iformall/service/pay/alipay/api/entity/memberCardModel/AlipayMemberCardModelStyle.java b/mallinkService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelStyle.java similarity index 93% rename from mallinkService/src/main/java/com/iformall/service/pay/alipay/api/entity/memberCardModel/AlipayMemberCardModelStyle.java rename to mallinkService/src/main/java/com/iformall/service/pay/alipay/api/reqEntity/AlipayMemberCardModelStyle.java index 746bb5a8b..b88f1fb7f 100644 --- a/mallinkService/src/main/java/com/iformall/service/pay/alipay/api/entity/memberCardModel/AlipayMemberCardModelStyle.java +++ b/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; diff --git a/mallinkService/src/main/java/com/iformall/service/pay/alipay/api/result/UserAuthData.java b/mallinkService/src/main/java/com/iformall/service/pay/alipay/api/result/UserAuthData.java new file mode 100644 index 000000000..a7b3b1062 --- /dev/null +++ b/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; +} diff --git a/mallinkService/src/main/java/com/iformall/service/pay/alipay/config/AliPayConfig.java b/mallinkService/src/main/java/com/iformall/service/pay/alipay/config/AliPayConfig.java index 3cd4959e0..11cfa16b0 100644 --- a/mallinkService/src/main/java/com/iformall/service/pay/alipay/config/AliPayConfig.java +++ b/mallinkService/src/main/java/com/iformall/service/pay/alipay/config/AliPayConfig.java @@ -17,5 +17,6 @@ public class AliPayConfig { private String appPublicKeyCertPath; private String alipayCertPath; private String alipayRootCertPath; + private String callback; } \ No newline at end of file diff --git a/mallinkService/src/main/resources/mapper/AliPayCUserMapper.xml b/mallinkService/src/main/resources/mapper/AliPayCUserMapper.xml new file mode 100644 index 000000000..608fcdc56 --- /dev/null +++ b/mallinkService/src/main/resources/mapper/AliPayCUserMapper.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + `id`,`tenant_id`,`parent_tenant_id`,`name`,`alipay_user_id`,`phone`,`card_open`,`user_id`,`update_date`,`create_date` + + + + where 1=1 + + + and `id` = #{id} + + + + and `tenant_id` = #{tenantId} + + + and `parent_tenant_id` = #{parentTenantId} + + + + and `name` like concat('%', #{name},'%') + + + + and `alipay_user_id` = #{alipayUserId} + + + + and `phone` = #{phone} + + + + and `user_id` = #{userId} + + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + + + + + update alipay_c_user set user_id=#{userId} + where id = #{id} and `tenant_id` = #{tenantId} + + + diff --git a/mallinkService/src/main/resources/mapper/WxMallMapper.xml b/mallinkService/src/main/resources/mapper/WxMallMapper.xml index ebf0ede7c..9caf7fd58 100644 --- a/mallinkService/src/main/resources/mapper/WxMallMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxMallMapper.xml @@ -38,6 +38,8 @@ + + @@ -46,7 +48,7 @@ `img_url`,`img_url_h`, `weap_note`, `img_qrcode_weapp`, `img_qrcode_wemp`, `weapp_share_title`,`weapp_share_cover_img`, `pos_qrcode_rule`, `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` diff --git a/mallinkSysAdmin/src/main/java/com/iformall/controller/pay/AlipayController.java b/mallinkSysAdmin/src/main/java/com/iformall/controller/pay/AlipayController.java new file mode 100644 index 000000000..4806bdb2d --- /dev/null +++ b/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 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 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."); + } + } +} diff --git a/mallinkSysAdmin/src/main/resources/application-dev.yml b/mallinkSysAdmin/src/main/resources/application-dev.yml index d6c58379e..0321bba01 100644 --- a/mallinkSysAdmin/src/main/resources/application-dev.yml +++ b/mallinkSysAdmin/src/main/resources/application-dev.yml @@ -151,6 +151,16 @@ wechat: max-wait: -1 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: encryptor: password: oRqdnDbK5pj3eMmB diff --git a/mallinkSysAdmin/src/main/resources/application-prod.yml b/mallinkSysAdmin/src/main/resources/application-prod.yml index 8c7c9ffd1..b7092e474 100644 --- a/mallinkSysAdmin/src/main/resources/application-prod.yml +++ b/mallinkSysAdmin/src/main/resources/application-prod.yml @@ -115,6 +115,15 @@ wechat: max-idle: 100 max-wait: -1 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: exception: true