Bootstrap

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

环境如下

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. 依赖、配置

		<!-- 支付宝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>
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. 二维码生成
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,<
;