支付小组
课程安排
对接第三方支付平台(支付宝微信)
了解支付宝微信服务逻辑(接收和返回参数)
针对神领物流的支付服务
交易流程

交易业务调用时序图

用户付款对应逻辑及数据

支付成功信息两种方式
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

最低0.47元/天 解锁文章
2939





