day3-神领物流-支付微服务研发(技术及demo)

支付小组

课程安排

对接第三方支付平台(支付宝微信)

了解支付宝微信服务逻辑(接收和返回参数)

针对神领物流的支付服务

交易流程

交易业务调用时序图

用户付款对应逻辑及数据

支付成功信息两种方式

1:支付宝主动通知,2:系统轮询查询

支付宝提供的支付流程

alipay.trade.precreate(统一收单线下交易预创建接口)

支付宝采用异步通知策略,不能一定接收到通知,故有以下轮询接口

alipay.trade.query(统一收单线下交易查询接口)

超时仍未收到支付成功通知,则使用撤销接口

 alipay.trade.cancel(统一收单交易撤销接口)

对接支付宝

说明

以下为支付宝各种支付产品。地址:支付宝开放平台

本项目主要使用当面付,逻辑大体类似。【当面付】这个API。 在当面付中,有两种支付场景,一种是【付款码支付】,另一种是【扫码支付】:

接口讲解

 本项目主要使用扫码支付的以下四个接口。预创建接口:生成二维码

参数配置

公共请求参数在配置文件中进行配置

业务请求参数只提供必要参数(使用Map封装,并用JSONUtil.toJsonStr()转为JSON,封装入公共请求参数的BizContent属性)

提交参数方式

传统:将所有请求封装到http请求中(麻烦)

使用支付宝SDK:只需创建对应接口的请求,封装业务必要请求参数即可(使用Map封装,并用JSONUtil.toJsonStr()转为JSON,封装入公共请求参数的BizContent属性)

SDK有两种,分别是通用版和Easy版,其中Easy版使用起来更加的简单,我们在项目中将采用Easy版进行开发

线下交易预创建接口构建及测试(通用SDK)

交易预创建接口参数文档

参数说明

业务必要参数说明

系统中有订单表,订单id关联在中间服务(交易服务)的交易单表中,与支付宝交互使用的是交易表及其id(tradeNo,即out_trade_no参数)。

支付成功时先用tradeNo将交易单改为成功,在根据关联的订单id将订单改为成功

标题:付款信息,要买什么东西

提交业务必要参数方式

使用Map封装,并用JSONUtil.toJsonStr()转为JSON,封装入公共请求参数的BizContent属性)

构建通用SDK相关配置及代码

构建一个springboot项目

注:此处只能创建固定版本的springboot,均不匹配本项目使用的jdk11版本,需要后续在pom文件中更改springboot的版本为2.6.6。

商户相关配置信息

与真实支付环境相同的联调测试环境 支付宝开放平台

授权回调地址随便设置一个,后续代码中可以指定

controller中基于支付宝沙箱环境创建一个支付宝客户端,并配置参数网关,id,应用私钥,支付宝公钥

 /**
     * 基于支付宝沙箱环境创建一个支付宝客户端:
     * 根据申请的沙箱环境对以下参数进行配置
     * @return
     */
    public AlipayClient client() {
        AlipayConfig alipayConfig = new AlipayConfig();
        // 设置支付宝网关地址
        alipayConfig.setServerUrl("https://openapi-sandbox.dl.alipaydev.com/gateway.do");
        // 设置应用ID
        alipayConfig.setAppId("9021000138659163");
        // 设置应用私钥
        alipayConfig.setPrivateKey("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtBf319aWY0aTg0WwCFoZMYovn4m6ZIDmaAh9woHlGjZfB7dC3SqY/cACQ+dYFxIp3RW3o7AMnp0UjN9IabpH3azG677HbEZFMGWLDarPIrOOcTsMjr6OKHkaSDG/O0aBCVw7ZVB3x1g+MxQmoCJiOXUc3WH02MDhmTNbPXDfKtP13P6+3kZ2nvr7hVGQxYQZo/eZ8B6oYvA2LcXNYRJhKgn7XxUz6XbGZocE8nEQKJ8CP4j/0Wkv7YU4HwX3fe582jNYO4XNinVcehKR6pXYTPDT+XhNTX92CU/XdGEaYNV7N4QXYxRZCnve1+PZC+LryiUik/CqWf6fhX4GAsAb/AgMBAAECggEAWHuG+4CLFhKoGdyfOpYgSfHfkE9ItgA31N2fDG7UdlM0t5URtppzWF/DumA5pitzkDkuUv5XQrEU90S1qpS/CuODxBCOSPS79EnLKxpnJIndwHK68oYAwUJoXooDp6WmKibxTgzpX2JUA25EWO1EbxGeuNwE9HBGd3J2LAcB9SQv0+po9TJbL33H5s6kDG0I+t9lm9k3Bdm9V8tK2iR7ycukn+anuMGBiRYfKOWxgOCME3hLbW4i1tbR46AObIZCE1ZuLrTWq0wgLXu7wRteHbp5StaLkp1m1nHexpyVWQbgIGBzRkmbmZjzxHxZYc1Ob9Q330Pwzmxr07xOwFVAWQKBgQDjKe1S7xQBLEL2cXZiy7Znr3d3Gd6xa1mNd2n4VbPx2ugcdRP9WOjpxUG4kTCXHZnLP6HtLti9p/taAj16aMitUxt+I2f3Mvwf3SDuqHUcvWLtwbEBqu3ZKYT1rjyb3SbSpM4RocAZY9TB4pFSsAQiPtyR/+gC4GCEa23F++1ukwKBgQDC/K5/V5fYnN8AnNpizwt4saeczKAASNuktTGpjBtLdAPGfWbgxZlljrNWB+g5RGFP9TjSvzM65Fyi79SsokVMkwO0t6PxpdunRHnf/mQkn0mELmLKUnABL5BJuq7v2nDxnna4rQKi0ehJkVEXbI9LanDK77EXsOM6lqiLqMhdZQKBgQCfjyacl0OU41MRqXa/RFmWEMC4DprGQiH/5P2xKfmgCuP4gSAOVvIaqaxVCN55dpg9FDAX2kzxQlmhymsGXS1/2R05h4MSNmSzuO3V1MuV6UzgtakwA7DXVXuH2d/Glxsa4BnCdrvo2Z9qpErxKqNsrnzdrEN6KcKBoLfVVfRbMwKBgB7ESjBzvNUEI7fwCBGRQ+kedykprJF+7ZF2uchcAC6Ots3KGcKby1GYC7omc0EeBhDcy8ONQeMoB2n6V9+Jl0+23t3UID1QA3HIP0bV2C1jKPF/dD0iduPpAmZv24yjNjEZ5PfM7N6OKo35LQd6LL4kpHmRCquHUMN85EltL3h1AoGBAKhrPmKR4BFlpubwO62EmsZl9JlBRtfehzwDg4ka/EssHIT0nRI4N95nEikbNovcl6RI08D2n2gbzUNC7Q0eYPwGh+RHenfmfda7rUnJJf62j0JCxQHStdMj9WZ1BTF/EFgYCfrhcYy3htYnc6d8MbxSfXeJZrgh22T/JUJs+v21");
        // 设置请求格式,固定值json
        alipayConfig.setFormat("json");
        // 设置字符集
        alipayConfig.setCharset("gbk");
        // 设置签名类型
        alipayConfig.setSignType("RSA2");
        // 设置支付宝公钥
        alipayConfig.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAou8kVhFr12A2E9QWUZQycIAmB/4SfCYnBO7noR97rOS+YmfahU8WAMT5zt1FaMo6fr0xjzyyXwLcGaHKPbhFsF/4oUS5Lv0F4Db3V3iZjzAJZasx7I9FstClh0uKqaX1RaNub+5zM7Gtm+efUtX/KfN8KyB1EwMOs/HzRdALNGYqWBFchOd7JsSrC8DFMGx7Zk3d8HB3t8lX8T6WETxt9zTVcYwKwkQkj4YJL5JNIZrFhM2v6ll++V8DvuPVgt203IIDYTsmO7ULzLz9Eq24/Ksq3CrqNr036yMUji7Tq20hpdP5iToZErYylT3xx8Ay/ohX+aVQtSXaFKqho1rZ2QIDAQAB");
        // 实例化客户端
        try {
            return new DefaultAlipayClient(alipayConfig);
        } catch (AlipayApiException e) {
            e.printStackTrace();
            System.out.println("初始化支付宝配置错误");
            throw new RuntimeException("初始化支付宝配置错误");
        }
    }
当面付 统一创建交易生成二维码接口(通用SDK使用样例)

逻辑:

1 接收网页传来的参数orderNo(使用查询参数,可以使用 @RequestParam 注解)

2 使用支付宝通用SDK创建一个 当面付 交易请求AlipayTradePrecreateRequest

3 将业务必要参数使用MapUtil.builder()进行封装,并传入biz_content(使用JSONUtil.toJsonStr()进行参数转换)

4 创建AlipayClient对象用.execute()发送请求。并用通用SDK创建一个 当面付 交易回复 接收结果

5 提取生成的二维码链接(string)并返回其 URL 或路径

    /**
     * 当面付 统一创建交易生成二维码接口
     * @param orderNo
     * @return
     */
    @RequestMapping("precreate")
    public String precreate(String orderNo) {
        // 演示:返回二维码连接
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
        // 交易单号     金额      标题
        Map<Object, Object> build = MapUtil.builder()
                .put("out_trade_no", orderNo).put("total_amount", "100").put("subject", "iphone").build();
        request.setBizContent(JSONUtil.toJsonStr(build));
        AlipayClient client = client();
        try {
            AlipayTradePrecreateResponse response = client.execute(request);
            // 生成图片二维码链接
            String qrCode = response.getQrCode();
            return createQrCode(qrCode);
        } catch (AlipayApiException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    /**
     * 生成的Base64编码的二维码字符串
     * @param qrCode
     * @return
     */
    public String createQrCode(String qrCode) {
        return QrCodeUtil.generateAsBase64(qrCode, new QrConfig(500, 500), "jpg");
    }
完整测试程代码
AliPayController
package com.sl.controller;
import cn.hutool.core.map.MapUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import cn.hutool.json.JSONUtil;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
@RequestMapping("alipay")
public class AliPayController {

    /**
     * 基于支付宝沙箱环境创建一个支付宝客户端:
     * 根据申请的沙箱环境对以下参数进行配置
     * @return
     */
    public AlipayClient client() {
        AlipayConfig alipayConfig = new AlipayConfig();
        // 设置支付宝网关地址
        alipayConfig.setServerUrl("https://openapi-sandbox.dl.alipaydev.com/gateway.do");
        // 设置应用ID
        alipayConfig.setAppId("9021000138659163");
        // 设置应用私钥
        alipayConfig.setPrivateKey("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtBf319aWY0aTg0WwCFoZMYovn4m6ZIDmaAh9woHlGjZfB7dC3SqY/cACQ+dYFxIp3RW3o7AMnp0UjN9IabpH3azG677HbEZFMGWLDarPIrOOcTsMjr6OKHkaSDG/O0aBCVw7ZVB3x1g+MxQmoCJiOXUc3WH02MDhmTNbPXDfKtP13P6+3kZ2nvr7hVGQxYQZo/eZ8B6oYvA2LcXNYRJhKgn7XxUz6XbGZocE8nEQKJ8CP4j/0Wkv7YU4HwX3fe582jNYO4XNinVcehKR6pXYTPDT+XhNTX92CU/XdGEaYNV7N4QXYxRZCnve1+PZC+LryiUik/CqWf6fhX4GAsAb/AgMBAAECggEAWHuG+4CLFhKoGdyfOpYgSfHfkE9ItgA31N2fDG7UdlM0t5URtppzWF/DumA5pitzkDkuUv5XQrEU90S1qpS/CuODxBCOSPS79EnLKxpnJIndwHK68oYAwUJoXooDp6WmKibxTgzpX2JUA25EWO1EbxGeuNwE9HBGd3J2LAcB9SQv0+po9TJbL33H5s6kDG0I+t9lm9k3Bdm9V8tK2iR7ycukn+anuMGBiRYfKOWxgOCME3hLbW4i1tbR46AObIZCE1ZuLrTWq0wgLXu7wRteHbp5StaLkp1m1nHexpyVWQbgIGBzRkmbmZjzxHxZYc1Ob9Q330Pwzmxr07xOwFVAWQKBgQDjKe1S7xQBLEL2cXZiy7Znr3d3Gd6xa1mNd2n4VbPx2ugcdRP9WOjpxUG4kTCXHZnLP6HtLti9p/taAj16aMitUxt+I2f3Mvwf3SDuqHUcvWLtwbEBqu3ZKYT1rjyb3SbSpM4RocAZY9TB4pFSsAQiPtyR/+gC4GCEa23F++1ukwKBgQDC/K5/V5fYnN8AnNpi
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值