0
点赞
收藏
分享

微信扫一扫

聚合支付项目-29

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 接口测试

微信:

  1. 微信C扫B渠道参数配置,其中请求参数param和payChannel使用下面的配置

{
    "appID": "wxd2bf2dba2e86a8c7",  
    "appSecret": "cec1a9185ad435abe1bced4b93f7ef2e",  
    "key": "95fe355daca50f1ae82f0865c2ce87c8",  
    "mchID": "1502570431",  
    "payKey": "95fe355daca50f1ae82f0865c2ce87c8"
}
"payChannel": "WX_JSAPI"

支付宝:

  1. 申请支付宝开放平台账号,并获取支付宝渠道参数信息 详见"支付宝开放平台使用指南.pdf"
  2. 支付宝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\" }"

举报

相关推荐

0 条评论