| @@ -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: | |||
| @@ -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 | |||
| @@ -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 ; | |||
| @@ -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 | |||
| @@ -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 | |||
| @@ -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返回失败"); | |||
| } | |||
| } | |||
| } | |||
| @@ -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: | |||
| @@ -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 | |||
| @@ -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<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= | |||
| @@ -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: | |||
| @@ -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 | |||
| @@ -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; | |||
| } | |||
| @@ -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<WxMallBuilding> buildings; | |||
| @@ -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); | |||
| } | |||
| @@ -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); | |||
| } | |||
| @@ -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); | |||
| } | |||
| } | |||
| } | |||
| @@ -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<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) { | |||
| try { | |||
| @@ -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<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 | |||
| * 订阅消息主题 | |||
| @@ -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; | |||
| } | |||
| } | |||
| @@ -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; | |||
| @@ -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; | |||
| @@ -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; | |||
| @@ -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; | |||
| @@ -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; | |||
| } | |||
| @@ -17,5 +17,6 @@ public class AliPayConfig { | |||
| private String appPublicKeyCertPath; | |||
| private String alipayCertPath; | |||
| private String alipayRootCertPath; | |||
| private String callback; | |||
| } | |||
| @@ -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 > 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> | |||
| @@ -38,6 +38,8 @@ | |||
| <result column="live_support" jdbcType="INTEGER" property="liveSupport"/> | |||
| <result column="cash_out_support" jdbcType="INTEGER" property="cashOutSupport"/> | |||
| <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> | |||
| <sql id="allColumns"> | |||
| @@ -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` | |||
| </sql> | |||
| <sql id="dynamicWhereConditions"> | |||
| @@ -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."); | |||
| } | |||
| } | |||
| } | |||
| @@ -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 | |||
| @@ -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 | |||