| @@ -165,6 +165,7 @@ alipay: | |||||
| appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt | appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt | ||||
| alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | ||||
| alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | ||||
| callback:https://callbacktest.malls.iformall.com/api/alipay/notify/callback | |||||
| jasypt: | jasypt: | ||||
| @@ -125,6 +125,7 @@ alipay: | |||||
| appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt | appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt | ||||
| alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | ||||
| alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | ||||
| callback:https://callbacktest.malls.iformall.com/api/alipay/notify/callback | |||||
| fm: | fm: | ||||
| exception: true | exception: true | ||||
| @@ -1,5 +1,8 @@ | |||||
| ALTER TABLE `wx_mall` | ALTER TABLE `wx_mall` | ||||
| ADD COLUMN `cash_out_support` INT(1) COMMENT '是否支持商户提现(不开启分账才有效) 0-不支持 1-支持' AFTER `live_support`; | |||||
| ADD COLUMN `alipay_app_auth_token` VARCHAR(60) COMMENT '支付宝app authToken,永久有效'; | |||||
| ALTER TABLE `wx_mall` | |||||
| ADD COLUMN `alipay_member_template_id` VARCHAR(40) COMMENT '支付宝会员卡模板编号'; | |||||
| UPDATE wx_mall SET cash_out_support = 0 ; | UPDATE wx_mall SET cash_out_support = 0 ; | ||||
| @@ -161,6 +161,7 @@ alipay: | |||||
| appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt | appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt | ||||
| alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | ||||
| alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | ||||
| callback:https://callbacktest.malls.iformall.com/api/alipay/notify/callback | |||||
| fm: | fm: | ||||
| exception: true | exception: true | ||||
| @@ -117,6 +117,7 @@ alipay: | |||||
| appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt | appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt | ||||
| alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | ||||
| alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | ||||
| callback:https://callbacktest.malls.iformall.com/api/alipay/notify/callback | |||||
| fm: | fm: | ||||
| exception: true | exception: true | ||||
| @@ -1,82 +1,79 @@ | |||||
| package com.iformall.controller; | package com.iformall.controller; | ||||
| import cn.binarywang.wx.miniapp.api.WxMaService; | |||||
| import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; | |||||
| import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; | |||||
| import cn.binarywang.wx.miniapp.bean.WxMaUserInfo; | |||||
| import cn.binarywang.wx.miniapp.util.crypt.WxMaCryptUtils; | |||||
| import com.alibaba.fastjson.JSON; | |||||
| import com.alibaba.fastjson.JSONObject; | |||||
| import com.iformall.annotation.AuthIgnore; | |||||
| import com.iformall.annotation.TenantIgnore; | |||||
| import com.github.pagehelper.PageInfo; | |||||
| import com.iformall.common.ErrorCode; | import com.iformall.common.ErrorCode; | ||||
| import com.iformall.common.Result; | import com.iformall.common.Result; | ||||
| import com.iformall.common.ResultData; | import com.iformall.common.ResultData; | ||||
| import com.iformall.domain.po.*; | |||||
| import com.iformall.domain.po.base.TenantEntity; | |||||
| import com.iformall.domain.vo.WxCUserVo; | |||||
| import com.iformall.domain.vo.WxLevelMerchantCVo; | |||||
| import com.iformall.enums.*; | |||||
| import com.iformall.service.*; | |||||
| import com.iformall.service.wechat.FmOpenService; | |||||
| import com.iformall.utils.Constant; | |||||
| import com.iformall.utils.IPUtil; | |||||
| import com.iformall.utils.RedisCacheUtils; | |||||
| import com.iformall.domain.po.WxActivity; | |||||
| import com.iformall.domain.po.WxMall; | |||||
| import com.iformall.domain.po.base.BaseEntity; | |||||
| import com.iformall.enums.EnumActivityEnrollStatus; | |||||
| import com.iformall.enums.EnumActivityStatus; | |||||
| import com.iformall.exception.MallinkException; | |||||
| import com.iformall.service.WxActivityService; | |||||
| import com.iformall.service.WxMallService; | |||||
| import com.iformall.service.pay.alipay.AliPayUtil; | |||||
| import com.iformall.utils.DateUtils; | |||||
| import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
| import io.swagger.annotations.ApiImplicitParam; | |||||
| import io.swagger.annotations.ApiImplicitParams; | |||||
| import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||
| import me.chanjar.weixin.common.error.WxErrorException; | |||||
| import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.web.bind.annotation.*; | |||||
| import org.springframework.web.context.request.RequestContextHolder; | |||||
| import org.springframework.web.context.request.ServletRequestAttributes; | |||||
| import org.springframework.web.bind.annotation.GetMapping; | |||||
| import org.springframework.web.bind.annotation.ModelAttribute; | |||||
| import org.springframework.web.bind.annotation.RequestMapping; | |||||
| import org.springframework.web.bind.annotation.RestController; | |||||
| import javax.servlet.http.HttpServletRequest; | |||||
| import javax.servlet.http.HttpServletResponse; | import javax.servlet.http.HttpServletResponse; | ||||
| import java.io.IOException; | |||||
| import java.io.PrintWriter; | |||||
| import java.math.BigDecimal; | |||||
| import java.io.UnsupportedEncodingException; | |||||
| import java.net.URLDecoder; | |||||
| import java.net.URLEncoder; | |||||
| import java.util.Date; | import java.util.Date; | ||||
| import java.util.HashMap; | import java.util.HashMap; | ||||
| import java.util.List; | |||||
| import java.util.Map; | import java.util.Map; | ||||
| /** | |||||
| * @author gongbiao | |||||
| */ | |||||
| @RestController | @RestController | ||||
| @RequestMapping("/api/alipay") | @RequestMapping("/api/alipay") | ||||
| @Api(description = "支付宝相关接口,包括支付宝用户端操作回调接口") | |||||
| public class AliPayController extends BaseController { | |||||
| @Api(description = "活动") | |||||
| public class AlipayController extends BaseController { | |||||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | private final Logger logger = LoggerFactory.getLogger(this.getClass()); | ||||
| @Autowired | @Autowired | ||||
| private WxCUserService wxCUserService; | |||||
| private WxMallService wxMallService; | |||||
| @Autowired | |||||
| private AliPayUtil alipayUtil; | |||||
| /** | |||||
| * 支付宝客户端回调接口 | |||||
| * 1. 商圈授权给isv后的回调。 isv账号登陆开放平台(https://openhome.alipay.com),选择平台应用,菜单“商家授权应用-发起授权”,复制链接或二维码给商圈支付宝账号扫。 | |||||
| * 2.用户在同意领取支付宝会员卡之后的回调。 | |||||
| * @param response | |||||
| * @param request | |||||
| * @throws IOException | |||||
| */ | |||||
| @AuthIgnore | |||||
| @RequestMapping(value = "/callback") | |||||
| @ResponseBody | |||||
| public void signature(HttpServletResponse response, HttpServletRequest request) throws IOException { | |||||
| @ApiOperation("分页列表接口") | |||||
| @GetMapping("getMemberPage") | |||||
| @ApiImplicitParams({ | |||||
| @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), | |||||
| @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) | |||||
| public ResultData getMemberPage(@ModelAttribute WxActivity wxActivity, Integer pageNum, Integer pageSize) { | |||||
| WxMall wxMall = wxMallService.getByTenantInfo(getTenantInfo()); | |||||
| if (null == wxMall ) { | |||||
| return new ResultData(Result.ERROR,"wxMall不存在"); | |||||
| } | |||||
| if (StringUtils.isBlank(wxMall.getAlipayAppAuthToken())) { | |||||
| return new ResultData(Result.ERROR,"wxMall alipayAppToken不存在"); | |||||
| } | |||||
| String source = request.getParameter("source"); | |||||
| //商家授权给ISV后的回调 | |||||
| if ("alipay_app_auth".equals(source)) { | |||||
| PrintWriter out = response.getWriter(); | |||||
| out.print("授权成功!"); | |||||
| out.close(); | |||||
| } | |||||
| if (StringUtils.isBlank(wxMall.getAlipayMemberTemplateId())) { | |||||
| return new ResultData(Result.ERROR,"wxMall alipayMemberTemplateId不存在"); | |||||
| } | |||||
| String url = alipayUtil.getSmartDistrictMemberCardUrl(wxMall.getAlipayAppAuthToken(), wxMall.getAlipayMemberTemplateId(), "memberAuth_"+wxMall.getTenantId()); | |||||
| try { | |||||
| return new ResultData(URLDecoder.decode(url, "utf-8")); | |||||
| } catch (UnsupportedEncodingException e) { | |||||
| logger.error("getMemberPage error url["+url+"]",e); | |||||
| return new ResultData(Result.ERROR,"url返回失败"); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -157,6 +157,7 @@ alipay: | |||||
| appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt | appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt | ||||
| alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | ||||
| alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | ||||
| callback:https://callbacktest.malls.iformall.com/api/alipay/notify/callback | |||||
| jasypt: | jasypt: | ||||
| encryptor: | encryptor: | ||||
| @@ -116,6 +116,7 @@ alipay: | |||||
| appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt | appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt | ||||
| alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | ||||
| alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | ||||
| callback:https://callbacktest.malls.iformall.com/api/alipay/notify/callback | |||||
| fm: | fm: | ||||
| exception: true | exception: true | ||||
| @@ -1,7 +1,12 @@ | |||||
| package com.iformall.controller.callback; | package com.iformall.controller.callback; | ||||
| import com.alibaba.fastjson.JSON; | import com.alibaba.fastjson.JSON; | ||||
| import com.iformall.common.IdWorker; | |||||
| import com.iformall.common.Result; | |||||
| import com.iformall.common.ResultData; | |||||
| import com.iformall.controller.base.BaseController; | import com.iformall.controller.base.BaseController; | ||||
| import com.iformall.domain.po.AliPayCUser; | |||||
| import com.iformall.domain.po.WxMall; | |||||
| import com.iformall.domain.po.msg.FmInsideNotifyPaySuccessMsg; | import com.iformall.domain.po.msg.FmInsideNotifyPaySuccessMsg; | ||||
| import com.iformall.domain.po.msg.FmInsideNotifyRefundSuccessMsg; | import com.iformall.domain.po.msg.FmInsideNotifyRefundSuccessMsg; | ||||
| import com.iformall.enums.*; | import com.iformall.enums.*; | ||||
| @@ -9,12 +14,18 @@ import com.iformall.exception.BizMessageException; | |||||
| import com.iformall.exception.MallinkException; | import com.iformall.exception.MallinkException; | ||||
| import com.iformall.mq.MqBaseProducer; | import com.iformall.mq.MqBaseProducer; | ||||
| import com.iformall.pay.WxPayment; | import com.iformall.pay.WxPayment; | ||||
| import com.iformall.service.AliPayCUserService; | |||||
| import com.iformall.service.WxMallService; | |||||
| import com.iformall.service.WxPayOrderService; | import com.iformall.service.WxPayOrderService; | ||||
| import com.iformall.service.WxRefundOrderService; | import com.iformall.service.WxRefundOrderService; | ||||
| import com.iformall.service.WxSubsidyService; | import com.iformall.service.WxSubsidyService; | ||||
| import com.iformall.service.pay.alipay.AliPayUtil; | |||||
| import com.iformall.service.pay.alipay.api.enums.EnumMemberCardConfig; | |||||
| import com.iformall.service.pay.alipay.api.result.UserAuthData; | |||||
| import com.iformall.utils.XmlUtil; | import com.iformall.utils.XmlUtil; | ||||
| import org.apache.commons.io.IOUtils; | import org.apache.commons.io.IOUtils; | ||||
| import org.jdom2.JDOMException; | import org.jdom2.JDOMException; | ||||
| import org.junit.platform.commons.util.StringUtils; | |||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||
| @@ -26,9 +37,12 @@ import org.springframework.web.bind.annotation.ResponseBody; | |||||
| import org.springframework.web.bind.annotation.RestController; | import org.springframework.web.bind.annotation.RestController; | ||||
| import javax.servlet.http.HttpServletRequest; | import javax.servlet.http.HttpServletRequest; | ||||
| import javax.servlet.http.HttpServletResponse; | |||||
| import java.io.ByteArrayOutputStream; | import java.io.ByteArrayOutputStream; | ||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.io.InputStream; | import java.io.InputStream; | ||||
| import java.io.PrintWriter; | |||||
| import java.nio.charset.Charset; | import java.nio.charset.Charset; | ||||
| import java.util.Map; | import java.util.Map; | ||||
| import java.util.SortedMap; | import java.util.SortedMap; | ||||
| @@ -50,7 +64,115 @@ public class AliPayController extends BaseController { | |||||
| private MqBaseProducer mqBaseProducer; | private MqBaseProducer mqBaseProducer; | ||||
| @Autowired | |||||
| private AliPayUtil alipayUtil; | |||||
| @Autowired | |||||
| private WxMallService mallService; | |||||
| @Autowired | |||||
| private AliPayCUserService aliPayCUserService; | |||||
| /** | |||||
| * 支付宝客户端回调接口 | |||||
| * 1. 商圈授权给isv后的回调。 isv账号登陆开放平台(https://openhome.alipay.com),选择平台应用,菜单“商家授权应用-发起授权”,复制链接或二维码给商圈支付宝账号扫。 | |||||
| * 2.用户在同意领取支付宝会员卡之后的回调。 | |||||
| * @param response | |||||
| * @param request | |||||
| * @throws IOException | |||||
| */ | |||||
| @RequestMapping(value = "/callback") | |||||
| @ResponseBody | |||||
| public void signature(HttpServletResponse response, HttpServletRequest request) throws IOException { | |||||
| String source = request.getParameter("source"); | |||||
| String scope = request.getParameter("scope"); | |||||
| String outString = request.getParameter("outString"); | |||||
| if (null == outString) { | |||||
| outString = ""; | |||||
| } | |||||
| PrintWriter out = response.getWriter(); | |||||
| //商家授权给ISV后的回调 | |||||
| if ("alipay_app_auth".equals(source)) { | |||||
| String tenantId = request.getParameter("state"); | |||||
| if (StringUtils.isBlank(tenantId)) { | |||||
| out.print("参数错误!tenantId为空."); | |||||
| }else { | |||||
| WxMall wxMall = mallService.getByTenantId(tenantId); | |||||
| if (null == wxMall ) { | |||||
| out.print("参数错误!wxMall未查询到."); | |||||
| }else { | |||||
| String appAuthCode = request.getParameter("app_auth_code"); | |||||
| if (StringUtils.isBlank(appAuthCode)) { | |||||
| out.print("参数错误!app_auth_code为空."); | |||||
| }else { | |||||
| String token = alipayUtil.getAppAuthToken(appAuthCode); | |||||
| if (StringUtils.isBlank(token)) { | |||||
| out.print("授权始飙,token为空,请重新再试!."); | |||||
| }else { | |||||
| wxMall.setAlipayAppAuthToken(token); | |||||
| mallService.update(wxMall); | |||||
| out.print("授权成功!."); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| //用户端授权行为 | |||||
| }else if (outString.startsWith("memberAuth")) { | |||||
| String authCode = request.getParameter("auth_code"); | |||||
| String requestId = request.getParameter("request_id"); | |||||
| String templateId = request.getParameter("template_id"); | |||||
| String[] args = outString.split("_"); | |||||
| String tenantId = args[1]; | |||||
| WxMall wxMall = mallService.getByTenantId(tenantId); | |||||
| if (null == wxMall ) { | |||||
| out.print("参数错误!wxMall未查询到."); | |||||
| } | |||||
| if (null == wxMall.getAlipayAppAuthToken() || "".equals(wxMall.getAlipayAppAuthToken()) ) { | |||||
| out.print("参数错误!wxMall alipayAppToken为空."); | |||||
| }else { | |||||
| UserAuthData authData = alipayUtil.queryUserAuthData(wxMall.getAlipayAppAuthToken(), authCode); | |||||
| if (null == authData ) { | |||||
| out.print("获取用户授权令牌错误!queryUserAuthData返回信息为空."); | |||||
| }else { | |||||
| Map<EnumMemberCardConfig,Object> map = alipayUtil.queryUserFormData(wxMall.getAlipayAppAuthToken(), authData.getAccessToken(), templateId, requestId); | |||||
| if (null == map) { | |||||
| out.print("获取用户表单信息错误!queryUserFormData返回信息为空."); | |||||
| }else { | |||||
| String phone = (String) map.get(EnumMemberCardConfig.OPEN_FORM_FIELD_MOBILE); | |||||
| if (StringUtils.isBlank(phone)) { | |||||
| out.print("获取用户表单信息错误!手机号为空."); | |||||
| }else { | |||||
| //查询该userId是否已经开卡,已经开卡不再开卡 | |||||
| AliPayCUser query = new AliPayCUser(); | |||||
| query.setAlipayUserId(authData.getUserId()); | |||||
| query.updateTenantInfo(wxMall); | |||||
| AliPayCUser alicuser = aliPayCUserService.getByAliPayUserId(query); | |||||
| if (null == alicuser) { | |||||
| //添加用户信息 | |||||
| alicuser = new AliPayCUser(); | |||||
| alicuser.setAlipayUserId(authData.getUserId()); | |||||
| alicuser.setPhone(phone); | |||||
| alicuser.updateTenantInfo(wxMall); | |||||
| aliPayCUserService.saveOrUpdate(alicuser); | |||||
| } | |||||
| if (null != alicuser.getCardOpen() && alicuser.getCardOpen() > 0) { | |||||
| out.print("用户授权成功!."); | |||||
| }else { | |||||
| boolean opencard = alipayUtil.openCard(wxMall.getAlipayAppAuthToken(), authData.getAccessToken(), templateId, authData.getUserId()); | |||||
| if (opencard) { | |||||
| alicuser.setCardOpen(1); | |||||
| aliPayCUserService.saveOrUpdate(alicuser); | |||||
| out.print("用户授权成功!."); | |||||
| }else { | |||||
| out.print("用户授权失败!."); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| out.close(); | |||||
| } | |||||
| /** | /** | ||||
| *ISV_GATEWAY_URL?charset=GBK&biz_content= | *ISV_GATEWAY_URL?charset=GBK&biz_content= | ||||
| @@ -163,6 +163,7 @@ alipay: | |||||
| appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt | appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt | ||||
| alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | ||||
| alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | ||||
| callback:https://callbacktest.malls.iformall.com/api/alipay/notify/callback | |||||
| jasypt: | jasypt: | ||||
| encryptor: | encryptor: | ||||
| @@ -121,6 +121,7 @@ alipay: | |||||
| appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt | appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt | ||||
| alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | ||||
| alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | ||||
| callback:https://callbacktest.malls.iformall.com/api/alipay/notify/callback | |||||
| fm: | fm: | ||||
| exception: true | exception: true | ||||
| @@ -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; | private Integer cashOutSupport; | ||||
| @io.swagger.annotations.ApiModelProperty(value="商户提现每日次数限制",name="cashOutLimit") | @io.swagger.annotations.ApiModelProperty(value="商户提现每日次数限制",name="cashOutLimit") | ||||
| private Integer cashOutLimit; | private Integer cashOutLimit; | ||||
| @io.swagger.annotations.ApiModelProperty(value="支付宝app authToken,永久有效",name="alipayAppAuthToken") | |||||
| private String alipayAppAuthToken; | |||||
| @io.swagger.annotations.ApiModelProperty(value="支付宝app authToken,永久有效",name="alipayAppAuthToken") | |||||
| private String alipayMemberTemplateId; | |||||
| @TableField(exist = false) | @TableField(exist = false) | ||||
| protected List<WxMallBuilding> buildings; | protected List<WxMallBuilding> buildings; | ||||
| @@ -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.io.UnsupportedEncodingException; | ||||
| import java.net.URLEncoder; | import java.net.URLEncoder; | ||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| import java.util.HashMap; | |||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | |||||
| import java.util.Set; | |||||
| import java.util.UUID; | import java.util.UUID; | ||||
| import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
| @@ -24,10 +27,12 @@ import com.alipay.easysdk.base.oauth.models.AlipaySystemOauthTokenResponse; | |||||
| import com.alipay.easysdk.kernel.Config; | import com.alipay.easysdk.kernel.Config; | ||||
| import com.alipay.easysdk.util.generic.models.AlipayOpenApiGenericResponse; | import com.alipay.easysdk.util.generic.models.AlipayOpenApiGenericResponse; | ||||
| import com.iformall.service.pay.alipay.api.AliPayApi; | import com.iformall.service.pay.alipay.api.AliPayApi; | ||||
| import com.iformall.service.pay.alipay.api.entity.memberCardModel.AlipayMemberCardModelColumn; | |||||
| import com.iformall.service.pay.alipay.api.entity.memberCardModel.AlipayMemberCardModelFieldRule; | |||||
| import com.iformall.service.pay.alipay.api.entity.memberCardModel.AlipayMemberCardModelRequest; | |||||
| import com.iformall.service.pay.alipay.api.entity.memberCardModel.AlipayMemberCardModelStyle; | |||||
| import com.iformall.service.pay.alipay.api.enums.EnumMemberCardConfig; | |||||
| import com.iformall.service.pay.alipay.api.reqEntity.AlipayMemberCardModelColumn; | |||||
| import com.iformall.service.pay.alipay.api.reqEntity.AlipayMemberCardModelFieldRule; | |||||
| import com.iformall.service.pay.alipay.api.reqEntity.AlipayMemberCardModelRequest; | |||||
| import com.iformall.service.pay.alipay.api.reqEntity.AlipayMemberCardModelStyle; | |||||
| import com.iformall.service.pay.alipay.api.result.UserAuthData; | |||||
| import com.iformall.service.pay.alipay.config.AliPayConfig; | import com.iformall.service.pay.alipay.config.AliPayConfig; | ||||
| import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
| @@ -50,6 +55,22 @@ public class AliPayUtil { | |||||
| payConfig.getAlipayCertPath(), payConfig.getAlipayRootCertPath()); | payConfig.getAlipayCertPath(), payConfig.getAlipayRootCertPath()); | ||||
| } | } | ||||
| private String getCallBack() { | |||||
| AliPayConfig payConfig = new AliPayConfig(); | |||||
| payConfig.setCallback("https://callbacktest.malls.iformall.com/api/alipay/notify/callback"); | |||||
| return payConfig.getCallback(); | |||||
| } | |||||
| //第三方应用授权 | |||||
| public String getAppAuthUrl(String param) { | |||||
| try { | |||||
| return AliPayApi.getAppAuthUrl(getConfig(), getCallBack(), param); | |||||
| } catch (UnsupportedEncodingException e) { | |||||
| log.error("alipay getMerchantAuthUrl error. ",e); | |||||
| } | |||||
| return null; | |||||
| } | |||||
| //查询app_auth_token | //查询app_auth_token | ||||
| public String getAppAuthToken(String appAuthCode) { | public String getAppAuthToken(String appAuthCode) { | ||||
| try { | try { | ||||
| @@ -167,7 +188,8 @@ public class AliPayUtil { | |||||
| public boolean setSmartDistrictMemberCardModelConfig(String appAuthToken,String templateId) { | public boolean setSmartDistrictMemberCardModelConfig(String appAuthToken,String templateId) { | ||||
| try { | try { | ||||
| AlipayOpenApiGenericResponse response = AliPayApi.setMemberCardModelConfig(getConfig(),appAuthToken, templateId, | AlipayOpenApiGenericResponse response = AliPayApi.setMemberCardModelConfig(getConfig(),appAuthToken, templateId, | ||||
| new String[] {"OPEN_FORM_FIELD_MOBILE","OPEN_FORM_FIELD_NAME"},new String[] {"OPEN_FORM_FIELD_GENDER"}); | |||||
| new String[] {EnumMemberCardConfig.OPEN_FORM_FIELD_MOBILE.getCode(),EnumMemberCardConfig.OPEN_FORM_FIELD_NAME.getCode()} | |||||
| ,new String[] {EnumMemberCardConfig.OPEN_FORM_FIELD_GENDER.getCode()}); | |||||
| JSONObject result = getGenericResponse(response.getHttpBody(),"alipay_marketing_card_formtemplate_set_response"); | JSONObject result = getGenericResponse(response.getHttpBody(),"alipay_marketing_card_formtemplate_set_response"); | ||||
| if (null != result) { | if (null != result) { | ||||
| return true; | return true; | ||||
| @@ -179,9 +201,9 @@ public class AliPayUtil { | |||||
| } | } | ||||
| //获取商圈会员卡领卡投放链接 | //获取商圈会员卡领卡投放链接 | ||||
| public String getSmartDistrictMemberCardUrl(String appAuthToken,String templateId,String appCallback,String param) { | |||||
| public String getSmartDistrictMemberCardUrl(String appAuthToken,String templateId,String param) { | |||||
| try { | try { | ||||
| AlipayOpenApiGenericResponse response = AliPayApi.getMemberCardUrl(getConfig(),appAuthToken, templateId, param, appCallback); | |||||
| AlipayOpenApiGenericResponse response = AliPayApi.getMemberCardUrl(getConfig(),appAuthToken, templateId, param, getCallBack()); | |||||
| JSONObject result = getGenericResponse(response.getHttpBody(),"alipay_marketing_card_activateurl_apply_response"); | JSONObject result = getGenericResponse(response.getHttpBody(),"alipay_marketing_card_activateurl_apply_response"); | ||||
| if (null != result) { | if (null != result) { | ||||
| return result.getString("apply_card_url"); | return result.getString("apply_card_url"); | ||||
| @@ -193,15 +215,81 @@ public class AliPayUtil { | |||||
| } | } | ||||
| //商圈智能积分授权(算法授权)URL | //商圈智能积分授权(算法授权)URL | ||||
| public String getH5SmartDistrictMallVipPointsUrl(String appId,String callback,String param) { | |||||
| public String getH5SmartDistrictMallVipPointsUrl(String appId,String param) { | |||||
| try { | try { | ||||
| return "https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id="+appId+"&scope=mall_vip_points&redirect_uri="+URLEncoder.encode(callback,"utf-8")+"&state="+param; | |||||
| return "https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id="+appId+"&scope=mall_vip_points&redirect_uri="+URLEncoder.encode(getCallBack(),"utf-8")+"&state="+param; | |||||
| } catch (UnsupportedEncodingException e) { | } catch (UnsupportedEncodingException e) { | ||||
| log.error("alipay getH5MallVipPointsUrl error. ",e); | log.error("alipay getH5MallVipPointsUrl error. ",e); | ||||
| } | } | ||||
| return null; | return null; | ||||
| } | } | ||||
| //获取用户授权令牌 | |||||
| public UserAuthData queryUserAuthData(String appAuthToken,String authCode) { | |||||
| try { | |||||
| AlipayOpenApiGenericResponse response = AliPayApi.queryUserAuthData(getConfig(), appAuthToken, authCode); | |||||
| JSONObject result = getGenericResponse(response.getHttpBody(),"alipay_system_oauth_token_response"); | |||||
| if (null != result) { | |||||
| UserAuthData authData = new UserAuthData(); | |||||
| authData.setUserId(result.getString("user_id")); | |||||
| authData.setAccessToken(result.getString("access_token")); | |||||
| return authData; | |||||
| } | |||||
| } catch (Exception e) { | |||||
| log.error("alipay queryUserAuthData error. ",e); | |||||
| } | |||||
| return null; | |||||
| } | |||||
| //查询用户表单信息 | |||||
| public Map<EnumMemberCardConfig,Object> queryUserFormData(String appAuthToken,String authToken,String templateId,String requestId) { | |||||
| try { | |||||
| AlipayOpenApiGenericResponse response = AliPayApi.queryUserFormData(getConfig(), appAuthToken, authToken, templateId, requestId); | |||||
| JSONObject result = getGenericResponse(response.getHttpBody(),"alipay_marketing_card_activateform_query_response"); | |||||
| if (null != result) { | |||||
| String infos = result.getString("infos"); | |||||
| if (StringUtils.isBlank(infos)) { | |||||
| return null; | |||||
| } | |||||
| JSONArray infosArray = JSON.parseArray(infos); | |||||
| if (null == infosArray) { | |||||
| return null; | |||||
| } | |||||
| Map<EnumMemberCardConfig,Object> map = new HashMap<EnumMemberCardConfig,Object>(); | |||||
| for (int i = 0 ; i < infosArray.size(); i++) { | |||||
| Map<String,Object> jo = (Map<String,Object>)infosArray.get(i); | |||||
| String[] keys = (String[]) jo.keySet().toArray(); | |||||
| EnumMemberCardConfig config = EnumMemberCardConfig.getEnum(keys[0]); | |||||
| if (null != config) { | |||||
| map.put(config, jo.get(keys[0])); | |||||
| } | |||||
| } | |||||
| if (map.isEmpty()) { | |||||
| return null; | |||||
| } | |||||
| return map; | |||||
| } | |||||
| } catch (Exception e) { | |||||
| log.error("alipay queryUserFormData error. ",e); | |||||
| } | |||||
| return null; | |||||
| } | |||||
| //用户开卡 | |||||
| public boolean openCard(String appAuthToken,String authToken,String templateId,String userId) { | |||||
| try { | |||||
| AlipayOpenApiGenericResponse response = AliPayApi.openCard(getConfig(), appAuthToken, authToken, templateId, userId); | |||||
| JSONObject result = getGenericResponse(response.getHttpBody(),"alipay_marketing_card_open_response"); | |||||
| if (null != result) { | |||||
| return true; | |||||
| } | |||||
| } catch (Exception e) { | |||||
| log.error("alipay openCard error. ",e); | |||||
| } | |||||
| return false; | |||||
| } | |||||
| //商圈消息订阅 | //商圈消息订阅 | ||||
| public boolean smartDistrictTopicSubscribe(String appAuthToken) { | public boolean smartDistrictTopicSubscribe(String appAuthToken) { | ||||
| try { | try { | ||||
| @@ -1,5 +1,8 @@ | |||||
| package com.iformall.service.pay.alipay.api; | package com.iformall.service.pay.alipay.api; | ||||
| import java.io.UnsupportedEncodingException; | |||||
| import java.net.URLEncoder; | |||||
| import java.util.Date; | |||||
| import java.util.HashMap; | import java.util.HashMap; | ||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | import java.util.Map; | ||||
| @@ -14,10 +17,11 @@ import com.alipay.easysdk.factory.Factory; | |||||
| import com.alipay.easysdk.kernel.Config; | import com.alipay.easysdk.kernel.Config; | ||||
| import com.alipay.easysdk.util.generic.models.AlipayOpenApiGenericResponse; | import com.alipay.easysdk.util.generic.models.AlipayOpenApiGenericResponse; | ||||
| import com.iformall.common.IdWorker; | import com.iformall.common.IdWorker; | ||||
| import com.iformall.service.pay.alipay.api.entity.memberCardModel.AlipayMemberCardModelColumn; | |||||
| import com.iformall.service.pay.alipay.api.entity.memberCardModel.AlipayMemberCardModelFieldRule; | |||||
| import com.iformall.service.pay.alipay.api.entity.memberCardModel.AlipayMemberCardModelRequest; | |||||
| import com.iformall.service.pay.alipay.api.entity.memberCardModel.AlipayMemberCardModelStyle; | |||||
| import com.iformall.service.pay.alipay.api.reqEntity.AlipayMemberCardModelColumn; | |||||
| import com.iformall.service.pay.alipay.api.reqEntity.AlipayMemberCardModelFieldRule; | |||||
| import com.iformall.service.pay.alipay.api.reqEntity.AlipayMemberCardModelRequest; | |||||
| import com.iformall.service.pay.alipay.api.reqEntity.AlipayMemberCardModelStyle; | |||||
| import com.iformall.utils.DateUtils; | |||||
| /** | /** | ||||
| * SDK说明 https://opendocs.alipay.com/open/54/00y8k9 | * SDK说明 https://opendocs.alipay.com/open/54/00y8k9 | ||||
| @@ -64,6 +68,19 @@ public class AliPayApi { | |||||
| return config; | return config; | ||||
| } | } | ||||
| /** | |||||
| * https://opendocs.alipay.com/open/common/105193 | |||||
| * 第三方应用授权 | |||||
| * @throws UnsupportedEncodingException | |||||
| */ | |||||
| public static String getAppAuthUrl(Config config,String callback,String param) throws UnsupportedEncodingException { | |||||
| String paramstr = ""; | |||||
| if (!StringUtils.isBlank(param)) { | |||||
| paramstr = "&state="+param; | |||||
| } | |||||
| return "https://openauth.alipay.com/oauth2/appToAppBatchAuth.htm?app_id="+config.appId+"&application_type=TINYAPP,WEBAPP,MOBILEAPP,PUBLICAPP&redirect_uri="+URLEncoder.encode(callback, "utf-8")+paramstr; | |||||
| } | |||||
| /** | /** | ||||
| * https://opendocs.alipay.com/open/common/105193 | * https://opendocs.alipay.com/open/common/105193 | ||||
| * https://opendocs.alipay.com/apis/api_9/alipay.open.auth.token.app | * https://opendocs.alipay.com/apis/api_9/alipay.open.auth.token.app | ||||
| @@ -193,6 +210,85 @@ public class AliPayApi { | |||||
| return response; | return response; | ||||
| } | } | ||||
| /** | |||||
| * https://opendocs.alipay.com/apis/api_9/alipay.system.oauth.token | |||||
| * 会员授权,换取授权访问令牌 | |||||
| * @return | |||||
| * @throws Exception | |||||
| */ | |||||
| public static AlipayOpenApiGenericResponse queryUserAuthData(Config config,String appAuthToken,String authCode) throws Exception { | |||||
| Factory.setOptions(config); | |||||
| //设置系统参数(OpenAPI中非biz_content里的参数) | |||||
| Map<String, String> textParams = new HashMap<String, String>(); | |||||
| textParams.put("app_auth_token", appAuthToken); | |||||
| //设置业务参数(OpenAPI中biz_content里的参数) | |||||
| Map<String, Object> bizParams = new HashMap<String, Object>(); | |||||
| bizParams.put("grant_type", "authorization_code"); | |||||
| bizParams.put("authorization_code", authCode); | |||||
| AlipayOpenApiGenericResponse response = Factory.Util.Generic().execute( | |||||
| "alipay.system.oauth.token", textParams, bizParams); | |||||
| return response; | |||||
| } | |||||
| /** | |||||
| * https://opendocs.alipay.com/apis/api_5/alipay.marketing.card.activateform.query | |||||
| * 查询用户提交的会员卡表单信息 | |||||
| * @return | |||||
| * @throws Exception | |||||
| */ | |||||
| public static AlipayOpenApiGenericResponse queryUserFormData(Config config,String appAuthToken,String authToken,String templateId,String requestId) throws Exception { | |||||
| Factory.setOptions(config); | |||||
| //设置系统参数(OpenAPI中非biz_content里的参数) | |||||
| Map<String, String> textParams = new HashMap<String, String>(); | |||||
| textParams.put("app_auth_token", appAuthToken); | |||||
| textParams.put("auth_token", authToken); | |||||
| //设置业务参数(OpenAPI中biz_content里的参数) | |||||
| Map<String, Object> bizParams = new HashMap<String, Object>(); | |||||
| bizParams.put("biz_type", "MEMBER_CARD"); | |||||
| bizParams.put("template_id", templateId); | |||||
| bizParams.put("request_id", requestId); | |||||
| AlipayOpenApiGenericResponse response = Factory.Util.Generic().execute( | |||||
| "alipay.marketing.card.activateform.query", textParams, bizParams); | |||||
| return response; | |||||
| } | |||||
| /** | |||||
| * https://opendocs.alipay.com/apis/api_5/alipay.marketing.card.open | |||||
| * 会员卡开卡 | |||||
| * @return | |||||
| * @throws Exception | |||||
| */ | |||||
| public static AlipayOpenApiGenericResponse openCard(Config config,String appAuthToken,String authToken,String templateId,String userId) throws Exception { | |||||
| Factory.setOptions(config); | |||||
| //设置系统参数(OpenAPI中非biz_content里的参数) | |||||
| Map<String, String> textParams = new HashMap<String, String>(); | |||||
| textParams.put("app_auth_token", appAuthToken); | |||||
| textParams.put("auth_token", authToken); | |||||
| //设置业务参数(OpenAPI中biz_content里的参数) | |||||
| Map<String, Object> bizParams = new HashMap<String, Object>(); | |||||
| IdWorker idWorker = IdWorker.get(); | |||||
| bizParams.put("out_serial_no", String.valueOf(idWorker.nextId())); | |||||
| bizParams.put("card_template_id", templateId); | |||||
| Map<String,String> userInfoMap = new HashMap<String,String>(); | |||||
| userInfoMap.put("user_uni_id", userId); | |||||
| userInfoMap.put("user_uni_id_type", "UID"); | |||||
| bizParams.put("card_user_info", userInfoMap); | |||||
| Map<String,Object> extInfoMap = new HashMap<String,Object>(); | |||||
| extInfoMap.put("open_date", new Date()); | |||||
| extInfoMap.put("valid_date", DateUtils.stringToDate("2051-05-01 00:00:00",DateUtils.DATE_TIME_PATTERN)); | |||||
| bizParams.put("card_ext_info", extInfoMap); | |||||
| AlipayOpenApiGenericResponse response = Factory.Util.Generic().execute( | |||||
| "alipay.marketing.card.open", textParams, bizParams); | |||||
| return response; | |||||
| } | |||||
| /** | /** | ||||
| * https://opendocs.alipay.com/apis/api_9/alipay.open.app.message.topic.subscribe | * https://opendocs.alipay.com/apis/api_9/alipay.open.app.message.topic.subscribe | ||||
| * 订阅消息主题 | * 订阅消息主题 | ||||
| @@ -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; | 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; | 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; | 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; | 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 appPublicKeyCertPath; | ||||
| private String alipayCertPath; | private String alipayCertPath; | ||||
| private String alipayRootCertPath; | 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="live_support" jdbcType="INTEGER" property="liveSupport"/> | ||||
| <result column="cash_out_support" jdbcType="INTEGER" property="cashOutSupport"/> | <result column="cash_out_support" jdbcType="INTEGER" property="cashOutSupport"/> | ||||
| <result column="cash_out_limit" jdbcType="INTEGER" property="cashOutLimit"/> | <result column="cash_out_limit" jdbcType="INTEGER" property="cashOutLimit"/> | ||||
| <result column="alipay_app_auth_token" jdbcType="VARCHAR" property="alipayAppAuthToken"/> | |||||
| <result column="alipay_member_template_id" jdbcType="VARCHAR" property="alipayMemberTemplateId"/> | |||||
| </resultMap> | </resultMap> | ||||
| <sql id="allColumns"> | <sql id="allColumns"> | ||||
| @@ -46,7 +48,7 @@ | |||||
| `img_url`,`img_url_h`, `weap_note`, `img_qrcode_weapp`, `img_qrcode_wemp`, | `img_url`,`img_url_h`, `weap_note`, `img_qrcode_weapp`, `img_qrcode_wemp`, | ||||
| `weapp_share_title`,`weapp_share_cover_img`, `pos_qrcode_rule`, | `weapp_share_title`,`weapp_share_cover_img`, `pos_qrcode_rule`, | ||||
| `sale_type`, `valid_start`, `valid_end`,`business_hours`,`introduction`,`img`, | `sale_type`, `valid_start`, `valid_end`,`business_hours`,`introduction`,`img`, | ||||
| `group_support`,`latitude`,`longitude`,`live_support`,`cash_out_support`,`cash_out_limit` | |||||
| `group_support`,`latitude`,`longitude`,`live_support`,`cash_out_support`,`cash_out_limit`,`alipay_app_auth_token`,`alipay_member_template_id` | |||||
| </sql> | </sql> | ||||
| <sql id="dynamicWhereConditions"> | <sql id="dynamicWhereConditions"> | ||||
| @@ -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 | max-wait: -1 | ||||
| min-idle: 10 | min-idle: 10 | ||||
| alipay: | |||||
| open: | |||||
| appId:"2021002137663024" | |||||
| appPrivateKey:"MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCUfymV5J73QQMG52PVIGUbowkloYCO4B7TQoKbrTZf2YeYsg/To/o4PiXPMNwEUfEUU8NYQ6WwNhCd2fa1ei8WFXJUf3bfgswtBk1aOmHLeY9yoXFxIKMTQ9RcobnmBzKQZlaAPMTSr7t1QtKZKPuc2gEHGRFYKO/ZuL8gIpnsVidVtmi52yd7hzao/pI3ThLA0lreg4L3rYP5ESQZRytxIPgUQ4KI11pZxFgbe+uy28AGDYIQscSIb+SWOHPYKLvOEqqepIZ8M18w/U0lZzpzepzi/V/llekvXJ6UEf1lzl7x/4UIA3WPN1B40+NzbD/OxEGTuM0UctOG6ZTd4Te9AgMBAAECggEAPYksnHbvARspu/SrRCh2fatkIPn6Ijrxyy3mnch7neCw9i/jqxpqmF/4nxFqO0gRlRDZBHyT7p+Y5zDpsW5+kLI2fJmNkzXKkmXoLBnBaOZo8WHBdtXFfjg/iltig9Y7t+cQtXd5QK2eCwuz5dA75FXa0ywqKdRdAGY0nYZ5LpwrHVU8RXheUDCJyhKNj2+W6lIaSKDxLZU3laO1oBrv1agcy7Crd5E2ndb8O3Enga+z7wSz2h7A1BasC/Yl/Ro0Y21wLCH3s/R6qA0Paq12+WEF+xdodM7SrP43CCTVFGbC1TfEOdanJfixop8QuYsIp7pHrL925+vP4eY9RfckgQKBgQDQqLdpDzzU7Ot/L9Vc/r8d4iwXXbX8+HwVFV4oBuausgFyv8eJJpfrI+IlEoB1ubJcPpJBFqfmeYTW6/v6ioFljJAlWfFvesUVt/HszBMIOsU0Bzt7ex6WlwKOagb0q0ZPA4T0OY0K0lg0loaaaR8ZTr4ivDymaGBtTBYhslpc7QKBgQC2MBznGEc5r2dhyENvdPOR20PnXQcevGnPdqSus8m0VmDcHE72RVcckcZtwczsb3NaLSqmjAcWTn51/VFmlvhB3F34FcFTPZGq6sj7fWK8HuFq7l7mu5OzYuVr73zy9ggsUuaw10IqvvwIVxszNAF0hiRnSGH3z27CoRmz3s+8EQKBgQCK3o7atBJ3X4rIJiypbL4DhIB1uJ+jUjk6yvLUTut+fufp1+tTw0S+cS5UIAEw2Lr1G4u5F/v8rwmTBJG6SC4gSLGyui6uVBYRA1BWmedcxchzfRDAeMt9y9kesUAZ3Fe5xIzbAeZ1ulKMBVZmM+pHrJlsgr0Wv0bV1xqvqITtbQKBgBIsIGXopQoa9dvqBtfyOW1eCprkS5aEQqWf9vM6Ga90QjsSU8n6xqKh48IE57TZtQ7UnIF6TCasc66/MsRh4KdpHLJnMR5lcMc0nhF/wz5ychehaTPol+X3wlyOyc7OPah2KG6ROhdbb3ZBggQMduyxiKYIsUTvmuOtAAxR+DSRAoGADtuDzGQDOJYWiO2uuP6FpA5IJaiwlSfu3xncJVfhO8SVr6VBJFg88igbIB3w6nk/sv7j9VTXqXre9HMvp1flxaaLsdxM4HcTSALS9q6t/ajaveqte6S5kAtWx0WW8C6PtgWXHbxcD7LXARSsKLoEl2JXXyUVS/m2l/RzHBQ8GJI=" | |||||
| appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt | |||||
| alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | |||||
| alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | |||||
| callback:https://callbacktest.malls.iformall.com/api/alipay/notify/callback | |||||
| jasypt: | jasypt: | ||||
| encryptor: | encryptor: | ||||
| password: oRqdnDbK5pj3eMmB | password: oRqdnDbK5pj3eMmB | ||||
| @@ -115,6 +115,15 @@ wechat: | |||||
| max-idle: 100 | max-idle: 100 | ||||
| max-wait: -1 | max-wait: -1 | ||||
| min-idle: 10 | min-idle: 10 | ||||
| alipay: | |||||
| open: | |||||
| appId:"2021002137663024" | |||||
| appPrivateKey:"MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCUfymV5J73QQMG52PVIGUbowkloYCO4B7TQoKbrTZf2YeYsg/To/o4PiXPMNwEUfEUU8NYQ6WwNhCd2fa1ei8WFXJUf3bfgswtBk1aOmHLeY9yoXFxIKMTQ9RcobnmBzKQZlaAPMTSr7t1QtKZKPuc2gEHGRFYKO/ZuL8gIpnsVidVtmi52yd7hzao/pI3ThLA0lreg4L3rYP5ESQZRytxIPgUQ4KI11pZxFgbe+uy28AGDYIQscSIb+SWOHPYKLvOEqqepIZ8M18w/U0lZzpzepzi/V/llekvXJ6UEf1lzl7x/4UIA3WPN1B40+NzbD/OxEGTuM0UctOG6ZTd4Te9AgMBAAECggEAPYksnHbvARspu/SrRCh2fatkIPn6Ijrxyy3mnch7neCw9i/jqxpqmF/4nxFqO0gRlRDZBHyT7p+Y5zDpsW5+kLI2fJmNkzXKkmXoLBnBaOZo8WHBdtXFfjg/iltig9Y7t+cQtXd5QK2eCwuz5dA75FXa0ywqKdRdAGY0nYZ5LpwrHVU8RXheUDCJyhKNj2+W6lIaSKDxLZU3laO1oBrv1agcy7Crd5E2ndb8O3Enga+z7wSz2h7A1BasC/Yl/Ro0Y21wLCH3s/R6qA0Paq12+WEF+xdodM7SrP43CCTVFGbC1TfEOdanJfixop8QuYsIp7pHrL925+vP4eY9RfckgQKBgQDQqLdpDzzU7Ot/L9Vc/r8d4iwXXbX8+HwVFV4oBuausgFyv8eJJpfrI+IlEoB1ubJcPpJBFqfmeYTW6/v6ioFljJAlWfFvesUVt/HszBMIOsU0Bzt7ex6WlwKOagb0q0ZPA4T0OY0K0lg0loaaaR8ZTr4ivDymaGBtTBYhslpc7QKBgQC2MBznGEc5r2dhyENvdPOR20PnXQcevGnPdqSus8m0VmDcHE72RVcckcZtwczsb3NaLSqmjAcWTn51/VFmlvhB3F34FcFTPZGq6sj7fWK8HuFq7l7mu5OzYuVr73zy9ggsUuaw10IqvvwIVxszNAF0hiRnSGH3z27CoRmz3s+8EQKBgQCK3o7atBJ3X4rIJiypbL4DhIB1uJ+jUjk6yvLUTut+fufp1+tTw0S+cS5UIAEw2Lr1G4u5F/v8rwmTBJG6SC4gSLGyui6uVBYRA1BWmedcxchzfRDAeMt9y9kesUAZ3Fe5xIzbAeZ1ulKMBVZmM+pHrJlsgr0Wv0bV1xqvqITtbQKBgBIsIGXopQoa9dvqBtfyOW1eCprkS5aEQqWf9vM6Ga90QjsSU8n6xqKh48IE57TZtQ7UnIF6TCasc66/MsRh4KdpHLJnMR5lcMc0nhF/wz5ychehaTPol+X3wlyOyc7OPah2KG6ROhdbb3ZBggQMduyxiKYIsUTvmuOtAAxR+DSRAoGADtuDzGQDOJYWiO2uuP6FpA5IJaiwlSfu3xncJVfhO8SVr6VBJFg88igbIB3w6nk/sv7j9VTXqXre9HMvp1flxaaLsdxM4HcTSALS9q6t/ajaveqte6S5kAtWx0WW8C6PtgWXHbxcD7LXARSsKLoEl2JXXyUVS/m2l/RzHBQ8GJI=" | |||||
| appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt | |||||
| alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | |||||
| alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | |||||
| callback:https://callbacktest.malls.iformall.com/api/alipay/notify/callback | |||||
| fm: | fm: | ||||
| exception: true | exception: true | ||||