5.4 支付渠道参数配置
5.4.1 系统设计
支付渠道参数配置数据模型如下:
支付渠道参数数据存储至支付渠道参数表(pay_channel_param)
APP_PLATFORM_CHANNEL_ID:为app_platform_channel表的主键即应用绑定服务类型表的主键,应用加服务类 型表示一个APP_PLATFORM_CHANNEL_ID。
APP_PLATFORM_CHANNEL_ID和PAY_CHANNEL唯一约束:即应用、服务类型、第三方支付渠道唯一约束,表示 为某应用所绑定的某服务类型的某支付渠道配置参数
例如:
应用app01,服务类型为huimin_c2b,两者在app_platform_channel表示app01应用绑定了huimin_c2b服务类型。
又由于huimin_c2b服务类型对应WX_JSAPI支付渠道,所以在支付渠道参数表pay_channel_param中为应用app01 所绑定的服务类型为huimin_c2b配置WX_JSAPI支付渠道参数。
5.4.2 交易服务-原始支付渠道查询接口(接口⑤)
配置参数页面会显示对应服务类型下的原始支付渠道
5.4.2.1 接口定义
这里是要查询某服务类型下的支付渠道,以便下一步为某支付渠道配置参数。
可从服务类型与支付渠道对应关系表关联查询:
1、接口描述:根据平台服务类型获取支付渠道列表
2、接口定义如下:
在PayChannelService接口中定义queryPayChannelByPlatformChannel:
/**
\* 根据平台服务类型获取支付渠道列表
\* @param platformChannelCode
\* @return
*/
List<PayChannelDTO> queryPayChannelByPlatformChannel(String platformChannelCode) throws BusinessException;
5.4.2.2 接口实现
1、在PlatformChannelMapper中定义selectPayChannelByPlatformChannel方法:
/**
* 根据服务类型code查询对应的支付渠道
* @param platformChannelCode 服务类型编码
* @return
*/
@Select("SELECT " +
" pc.* " +
"FROM" +
" platform_pay_channel ppc," +
" pay_channel pc," +
" platform_channel pla " +
"WHERE ppc.PAY_CHANNEL = pc.CHANNEL_CODE " +
" AND ppc.PLATFORM_CHANNEL = pla.CHANNEL_CODE " +
" AND pla.CHANNEL_CODE = #{platformChannelCode} ")
List<PayChannelDTO> selectPayChannelByPlatformChannel(String platformChannelCode);
2、在PayChannelServiceImpl类定义queryPayChannelByPlatformChannel实现方法:
@Override
public List<PayChannelDTO> queryPayChannelByPlatformChannel(String platformChannelCode) {
return platformChannelMapper.selectPayChannelByPlatformChannel(platformChannelCode);
}
5.4.2.3 接口测试
在交易 服务进行单元 测试,编写单元 测试类
package com.huiminpay.transaction;
import com.huiminpay.transaction.api.PayChannelService;
import com.huiminpay.transaction.api.dto.PayChannelDTO;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
/**
/* @author Administrator
/* @version qawine
**/
@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class TestPayChannelService {
@Autowired
PayChannelService payChannelService;
//测试根据服务类型查询支付渠道
@Test
public void testqueryPayChannelByPlatformChannel(){
List<PayChannelDTO> huimin_c2b =
payChannelService.queryPayChannelByPlatformChannel("huimin_c2b");
System.out.println(huimin_c2b);
}
}
5.4.3 商户平台应用-支付渠道查询接口(接口⑥)
5.4.3.1 接口定义
1、接口描述:根据服务类型查询支付渠道列表
2、接口定义如下:
在PlatformParamController类中定义queryPayChannelByPlatformChannel:
@ApiOperation("根据平台服务类型获取支付渠道列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "platformChannelCode", value = "服务类型编码", required =
true, dataType = "String", paramType = "path")
})
@GetMapping(value="/my/pay-channels/platform-channel/{platformChannelCode}")
public List<PayChannelDTO> queryPayChannelByPlatformChannel(@PathVariable String platformChannelCode){
return payChannelService.queryPayChannelByPlatformChannel(platformChannelCode);
}
5.4.3.2 接口测试
使用Postman:http://localhost:57010/merchant/my/pay-channels/platform-channel/huimin_c2b 返回值:
[
{
"id": 1,
"channelName": "微信JSAPI",
"channelCode": "WX_JSAPI"
},
{
"id": 2,
"channelName": "支付宝手机网站支付",
"channelCode": "ALIPAY_WAP"
}
]
5.4.4 交易服务-支付渠道参数配置接口(接口⑦)
为指定原始支付渠道配置
5.4.4.1 接口定义
本接口是为应用配置支付渠道参数,前边为应用绑定了服务类型,此接口即为应用所绑定的服务类型配置支付渠道 参数。
1、接口描述:保存支付渠道参数
2、接口定义如下:
在PayChannelService中定义createPayChannelParam方法:
/**
/* 保存支付渠道参数
/* @param payChannelParam 商户原始支付渠道参数
*/
void savePayChannelParam(PayChannelParamDTO payChannelParam) throws BusinessException;
5.4.4.2 接口实现
服务层提供一个接口实现支付渠道参数配置,如果该应用的服务类型已经配置某支付渠道参数则执行更新操作,否 执行添加操作。
例如:
在PayChannelServiceImpl类中定义savePayChannelParam实现方法:
@Autowired
private PayChannelParamMapper payChannelParamMapper;
/**
\* 保存支付渠道参数
\* @param payChannelParamDTO 支付渠道参数
\* @throws BusinessException
*/
@Override
public void savePayChannelParam(PayChannelParamDTO payChannelParamDTO) throws BusinessException {
if(payChannelParamDTO == null
|| StringUtils.isBlank(payChannelParamDTO.getAppId())
|| StringUtils.isBlank(payChannelParamDTO.getPlatformChannelCode())
|| StringUtils.isBlank(payChannelParamDTO.getPayChannel())){
throw new BusinessException(CommonErrorCode.E_300009);
}
//根据appid和服务类型查询应用与服务类型绑定id
Long appPlatformChannelId = selectIdByAppPlatformChannel(payChannelParamDTO.getAppId(), payChannelParamDTO.getPlatformChannelCode());
if(appPlatformChannelId == null){
//应用未绑定该服务类型不可进行支付渠道参数配置
throw new BusinessException(CommonErrorCode.E_300010);
}
//根据应用与服务类型绑定id和支付渠道查询参数信息
PayChannelParam payChannelParam = payChannelParamMapper.selectOne(
new LambdaQueryWrapper<PayChannelParam>()
.eq(PayChannelParam::getAppPlatformChannelId, appPlatformChannelId)
.eq(PayChannelParam::getPayChannel, payChannelParamDTO.getPayChannel()));
//更新已有配置
if (payChannelParam!=null){
payChannelParam.setChannelName(payChannelParamDTO.getChannelName());
payChannelParam.setParam(payChannelParamDTO.getParam());
payChannelParamMapper.updateById(payChannelParam);
}else{
//添加新配置
PayChannelParam entity = PayChannelParamConvert.INSTANCE.dto2entity(payChannelParamDTO);
entity.setId(null);
//应用与服务类型绑定id
entity.setAppPlatformChannelId(appPlatformChannelId);
payChannelParamMapper.insert(entity);
}
}
/**
* 根据应用id 、服务类型code 查询应用与服务类型的绑定id
* @param appId
* @param platformChannelCode
* @return
*/
private Long selectIdByAppPlatformChannel(String appId,String platformChannelCode){
AppPlatformChannel appPlatformChannel = appPlatformChannelMapper.selectOne(
new LambdaQueryWrapper<AppPlatformChannel>()
.eq(AppPlatformChannel::getAppId, appId)
.eq(AppPlatformChannel::getPlatformChannel, platformChannelCode));
if(appPlatformChannel!=null){
return appPlatformChannel.getId();//应用与服务类型的绑定id
}
return null;
}
5.4.5 商户平台应用-支付渠道参数配置接口(接口⑧)
5.4.5.1 接口定义
1、接口描述:请求交易服务保存支付渠道参数配置
2、接口定义如下:
前端提供两个接口:新增和更新
在PlatformParamController类中下定义createPayChannelParam
@ApiOperation("商户配置支付渠道参数")
@ApiImplicitParams({
@ApiImplicitParam(name = "payChannelParam", value = "商户配置支付渠道参数",
required = true, dataType = "PayChannelParamDTO", paramType = "body")
})
@RequestMapping(value = "/my/pay-channel-params",
method = {RequestMethod.POST,RequestMethod.PUT})
public void createPayChannelParam(@RequestBody PayChannelParamDTO payChannelParam){
Long merchantId = SecurityUtil.getMerchantId();
payChannelParam.setMerchantId(merchantId);
payChannelService.savePayChannelParam(payChannelParam);
}
5.4.5.2 接口测试
微信:
- 微信C扫B渠道参数配置,其中请求参数param和payChannel使用下面的配置
{
"appID": "wxd2bf2dba2e86a8c7",
"appSecret": "cec1a9185ad435abe1bced4b93f7ef2e",
"key": "95fe355daca50f1ae82f0865c2ce87c8",
"mchID": "1502570431",
"payKey": "95fe355daca50f1ae82f0865c2ce87c8"
}
"payChannel": "WX_JSAPI"
支付宝:
- 申请支付宝开放平台账号,并获取支付宝渠道参数信息 详见"支付宝开放平台使用指南.pdf"
- 支付宝C扫B渠道参数配置,将其中的appId、rsaPrivateKey、alipayPublicKey、notifyUrl、returnUrl替换为 自己的配置。
{
"appId": "2016101000652290",
"rsaPrivateKey": "MIIEvQIBADANBgkqhkiG9w0...",
"alipayPublicKey": "MIIBIjANBgkqhkiG9w0BAQ...",
"notifyUrl": "http://127.0.0.1:56010/payment-receiver/alipay-notify",
"returnUrl": "http://127.0.0.1:56010/payment-receiver/alipay-return",
"url": "https://openapi.alipaydev.com/gateway.do",
"charest": "UTF-8",
"format": "json",
"log_path": "/log",
"signtype": "RSA2"
}
"payChannel": "ALIPAY_WAP"
上图中,param为json串,需要使用EditPlus软件将json串合并为一行,并且用idea工具将字符串双引号转义。
然后替换掉制表符。
后使用idea将双引号转义,如下:
"{ \"appID\": \"wxd2bf2dba2e86a8c7\", \"appSecret\": \"cec1a9185ad435abe1bced4b93f7ef2e\",
\"key\": \"95fe355daca50f1ae82f0865c2ce87c8\", \"mchID\": \"1502570431\", \"payKey\":
\"95fe355daca50f1ae82f0865c2ce87c8\" }"