支付宝沙箱版模拟网站在线完整支付流程(无营业无费用)内网穿透+局域网测试

支付宝沙箱版模拟网站在线完整支付流程(无营业无费用)内网穿透+局域网测试

环境如下

Version
手机 安卓
支付平台 支付宝
SpringBoot 3.2.1
alipay-sdk-java 4.38.200.ALL

一、介绍

系统处于开发阶段时,无需营业执照,无需任何费用,沙箱模拟网站在线完整支付流程。

参考资料如下:

1. 支付

有一个在线网站,可以为商品生成支付二维码,手机支付宝扫码,支付。

支付流程大体如下:

2. 支付结果

获取支付结果有两种方法

  • 一种为主动查询。在顾客支付后再查询方可得到正确的结果,然而这个时机是无法确定的。
  • 一种为被动接收。顾客支付后,支付宝服务器向微服务发送消息通知。

二、前提准备

1. 支付宝开放平台

  1. 注册支付宝开放平台
    https://openhome.alipay.com/

  2. 来到控制台下滑找到沙箱
    https://openhome.alipay.com/develop/manage
    或者点这里进入沙箱环境
    https://openhome.alipay.com/develop/sandbox/app

  3. 下载支付宝沙箱版到手机

2. 内网穿透

  1. 下载软件
    https://hsk.oray.com/download
    本文选择的是贝锐花生壳,会赠送一个域名。

  2. 添加映射

    • 映射类型:HTTPS
    • 外网端口:貌似改不了
    • 内网ip:port:order微服务的地址端口。

这样之后,谁往https://5m34y83626.vicp.fun/orders/receivenotify发送请求,就相当于往order微服务的/orders/receivenotify这个端点发送请求。

3. 局域网

参考这篇文章
同一Wifi下允许手机访问电脑(win10)

主要目的就是要知道,手机通过什么ip可以访问到电脑。本文是192.168.0.102,所以访问192.168.0.102:63030就相当于访问到了order微服务

三、order微服务

1. 依赖、配置

language-xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- 支付宝SDK -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.38.200.ALL</version>
</dependency>
<!--生成二维码-->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.3</version>
</dependency>
language-yml
1
2
3
4
5
6
7
8
9
10
11
12
server:
servlet:
context-path: /orders
port: 63030

pay:
#扫描二维码得到url
qrcodeurl: http://???:63030/orders/requestpay?payNo=%s
alipay:
APP_ID: ???
APP_PRIVATE_KEY: ???
ALIPAY_PUBLIC_KEY: ???

???填充分别为

  1. 在同一局域网中手机访问电脑的ip

  2. 沙箱环境->沙箱应用->应用信息->基本信息

  3. 沙箱环境->沙箱应用->应用信息->开发信息->应用私钥

  4. 沙箱环境->沙箱应用->应用信息->开发信息->支付宝公钥

2. 工具类

1. 二维码生成

language-java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package com.xuecheng.orders.config;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.xuecheng.base.utils.EncryptUtil;
import jakarta.servlet.ServletOutputStream;
import org.apache.commons.lang3.StringUtils;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;

/**
* @author mumu
* @version 1.0
* @description 二维码生成工具
* @date 2024/02/16 14:56
*/
public class QRCodeUtil {


/**
* 生成二维码
*
* @param content 二维码对应的URL
* @param width 二维码图片宽度
* @param height 二维码图片高度
* @return
*/
public String createQRCode(String content, int width, int height) throws IOException {


String resultImage = "";
//除了尺寸,传入内容不能为空
if (!StringUtils.isEmpty(content)) {


ServletOutputStream stream = null;
ByteArrayOutputStream os = new ByteArrayOutputStream();
//二维码参数
@SuppressWarnings("rawtypes")
HashMap<EncodeHintType,<