聚合支付-第3章-支付宝支付接入指南

news2024/10/6 8:35:42

惠民支付 第3章讲义-支付宝接入指南

支付宝接入步骤:
1、进入网址https://open.alipay.com/develop/manage
2、扫码登录支付宝账号,控制台,最下边有一个沙箱环境
3、在“支付宝开放平台开发助手”软件中生成密钥,点击生成密钥,保存“应用私钥”和“应用公钥”
4、在浏览器沙箱环境中,沙箱应用--应用信息--开发信息--自定义密钥--设置并查看--将“应用公钥”粘进去得到“支付宝	公钥”,记得保存一下
5、在huiminpay-common中添加com.google.zxing二维码生成相关依赖,并添加二维码生成工具类QRCodeUtil
6、com.alipay.sdk作为测试战场,在huiminpay父pom.xml中添加支付宝的sdk版本依赖,在子项目中也添加相关sdk依	赖
7、在transaction交易服务新建Controller,定义下单接口,修改
	APP_ID、
	应用私钥APP_PRIVATE_KEY、
	支付宝公钥ALIPAY_PUBLIC_KEY、
	支付宝网关地址serverUrl、
	二维码生成qrCodeUtil.createQRCode的url请求地址,让扫码用户可以请求到controller的接口
8、运行transaction交易服务,在控制台复制data(二维码网址链接),在浏览器地址栏显示二维码并截图保存
9、使用pc端的微信扫码测试,账号是沙箱账号--买家信息--买家账号,密码是支付密码

1 支付产品

1.1 产品列表

支付宝为普通商户提供如下支付产品:

在这里插入图片描述

产品介绍详见:https://b.alipay.com/signing/productSetV2.htm
1、当面付

在国内线下场景,商家可通过以下任一方式进行收款。提升商家收银效率,资金实时到账。

  1. 商家通过扫描线下买家支付宝钱包中的条码、二维码等方式完成支付;

在这里插入图片描述

  1. 线下买家通过使用支付宝钱包扫一扫,扫描商家的二维码等方式完成支付。

    在这里插入图片描述

2、APP支付

商家APP集成支付宝提供的支付能力,在线上轻松收款:

用户在商家APP消费,自动跳转支付宝完成付款,付款后自动跳回。 轻松享受更全面、更安全的支付服务。

在这里插入图片描述

3、刷脸付

无需手机,刷脸支付:

当不便使用手机或没有手机时,用户亦可“刷脸”完成——通过线下支付机具读取脸部完成自助结账等支付行为,快
捷安全方便。 商家多一种方案,用户多一种选择,同样方便安全。

在这里插入图片描述

4、手机网站支付

无需开发APP,手机网站同样能轻松收款:

用户在商家手机网站消费,通过浏览器自动跳转支付宝APP或支付宝网页完成付款。 轻松实现和APP支付相同的支
付体验。

在这里插入图片描述

5、电脑网站支付

PC网站轻松收款,资金马上到账:

用户在商家PC网站消费,自动跳转支付宝PC网站收银台完成付款。 交易资金直接打入商家支付宝账户,实时到
账。

在这里插入图片描述

1.2 线下场所接入支付

下边列出接入聚合支付平台且应用于线下场所的支付方式。

线下场所泛指商超、便利店、餐饮、医院、学校、电影院和旅游景区等具有明确经营地址的实体场所。

1、当面付

商家通过扫描线下买家支付宝钱包中的条码、二维码等方式完成支付;

条码支付应用于B扫C的场景,即商户扫客户。

2、手机网站支付

买家用支付宝客户端打开H5网页,点击支付,打开支付宝客户端支付界面,完成支付。

手机网站支付应用于C扫B场景,即客户扫商户。

惠民支付接入“支付宝手机网站支付”完成C扫B自由输入金额的支付,原因如下:

聚合支付对C扫B的一个需求是用户可自由输入金额,且向用户展示订单信息,存在手机网页交互,所以使用手机
网站支付可以满足需求。

2 配置支付宝沙箱环境

接入手机网站支付需要具备如下条件:

  • 申请前必须拥有经过实名认证的支付宝账户;

  • 企业或个体工商户可申请;

  • 需提供真实有效的营业执照,且支付宝账户名称需与营业执照主体一致;

  • 网站能正常访问且页面显示完整,网站需要明确经营内容且有完整的商品信息;

  • 网站必须通过ICP备案。如为个体工商户,网站备案主体需要与支付宝账户主体名称一致;

  • 如为个体工商户,则团购不开放,且古玩、珠宝等奢侈品、投资类行业无法申请本产品。

详细参见:https://docs.open.alipay.com/203

本文档使用支付宝沙箱进行开发测试,这里主要介绍支付宝沙箱环境配置。

详细参见:https://docs.open.alipay.com/200/105311/

2.1 注册开放平台账号

已有沙箱账号:https://open.alipay.com/develop/sandbox/account

1、注册支付宝开放平台账号

首先需要注册一个支付宝账号:

注册地址:https://developers.alipay.com/developmentAccess/developmentAccess.htm

在这里插入图片描述

注册成功,登录支付宝开放平台

在这里插入图片描述

2、进入研发服务

登录成功,点击“研发服务”进入研发服务查看沙箱配置

在这里插入图片描述

进入研发服务,左侧菜单列出了沙箱环境的配置菜单

在这里插入图片描述

现在沙箱在控制台页面:https://developers.alipay.com/develop/manage

2.2 配置密钥

使用支付沙箱需要配置密钥,密钥作为与支付宝接口对接的必要参数。

下载密钥生成工具:AlipayDevelopmentAssistant-1.0.2.exe,执行安装,注意不要安装在有空格的目录中

https://ideservice.alipay.com/ide/getPluginUrl.htm?clientType=assistant&platform=win&channelType=WEB
AlipayDevelopmentAssistant-1.0.2.exe安装包在资料文件夹也提供的有,不想下载可直接使用。

安装成功,进入安装目录:

在这里插入图片描述

安装成功,进入安装目录,双击“支付宝开放平台开发助手.exe”,使用工具生成密钥(应用私钥和应用公钥),如
下图,点击“生成密钥”

在这里插入图片描述

复制应用公钥,进行设置,点击下图中的“设置”,将应用公钥粘贴进去,点击“保存设置”:

在这里插入图片描述

在这里插入图片描述

填入应用公钥,点击保存设置。

此时,再查看RSA2密钥

在这里插入图片描述

注意:需要保存好支付宝公钥和使用“支付宝开放平台开发助手.exe”生成的私钥,在开发中要使用两者。

2.3 沙箱账号

获取沙箱账号作为支付宝客户端(沙箱版本)的登录账号。

点击研发服务进入,点击“沙箱账号”列出商家账号和买家账号。

在这里插入图片描述

在这里插入图片描述

注意:C扫B测试需要使用买家账号,请保证账号余额不为0,否则会影响付款,测试前进行充值(假数据,充值不
要钱_)。

3 测试环境准备

我们在测试支付宝下单接口时需要使用支付宝扫描二维码,需要在手机安装支付宝客户端(沙箱版本),用沙箱账
号登录支付宝,扫二维码,二维码的地址即为下单接口的地址。

本项目使用模拟器进行测试,使用模拟器和使用手机测试效果一致。

3.1 安装模拟器

下载模拟器:http://mumu.163.com/,也可以使用资料文件夹中的MuMuInstaller,如下:

MuMuInstaller_1.1.0.4_nochannel_zh‐Hans_1573633675.exe

安装模拟器,安装在没有空格和中文的目录

安装成功,启动模拟器

3.2 安装支付宝

选择资料文件夹提供的支付宝安装包wallet_101521226_client_release_201812261416.apk(沙箱版本)

安装成功后支付宝客户端的快捷方式出现在桌面上。

3.3 登录支付宝

使用沙箱环境的买家账号登录沙箱版本的支付宝。

查看沙箱环境的账号:

3.4 生成二维码技术预研

ZXing是一个开源的,用Java编写的多格式的1D / 2D条码图像处理库,使用ZXing可以生成、识别QR Code(二维
码)。常用的二维码处理库还有zbar,近几年已经不再更新代码,下边介绍ZXing生成二维码的方法。

1)引入依赖

在huiminpay-common工程pom.xml中添加依赖:

 <!--二维码生成&识别组件 -->
        <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>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>

2)生成二维码方法

复制二维码工具类QRCodeUtil.java到项目中

测试根据内容生成二维码方法,在QRCodeUtil中添加main方法如下:

public static void main(String[] args) throws IOException {  
QRCodeUtil qrCodeUtil = new QRCodeUtil();    
System.out.println(qrCodeUtil.createQRCode("http://www.baidu.com/", 200, 200));    

}  

运行main方法,将输出的内容复制到浏览器地址后回车

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADIAQAAAACFI5MzAAABPklEQVR42u2YsXHDMAxF4WPhUiNoFI1GjaZRPIJKFzoiHyDARHGSKsXXnVmYop6aT4IfgEV/G/Imf5JdbNz1sdh6nzdfz+xkxosDRGorz0m36h/Qk01ux/1zqlB3GYKtbzgMvRaxoCl6HeKxs8uyNgv1l6jiJP2eWtCkrPMNpiQxTI/qU+YXt6QkXQFCXVcpILkiJ7LozYRs8MSUNbETSzzDDGV64MdkkROP+L79euDR9Hy5p6wEr5rn+r795pCZ64kJYgdJHkIUTg4hq6d8doLn8ERzcpzCiB1qAgv37a/iQtZWRuxQk0iXUahgSrekJSP/SI38k07OTLJfsAvq/UL93klQkqirEPh9iuvKTqLy7hVKjKuQ3t6gRTt5PDsxQ0eu1zwMdjL64KwGi/KTU7/gpeyPnQQXef+T9b/kAxjMLsW+DpG+AAAAAElFTkSuQmCC

使用手机扫描二维码,即可自动打开百度官网

4 手机网站支付接口

本章节介绍支付宝手机网站支付接入方法,详细参见:https://docs.open.alipay.com/203/

4.1 场景介绍

支付宝手机网站支付适用于商家在移动端网页应用中集成支付宝支付功能。

商家在网页应用中调用支付宝提供的网页支付接口,接口会调起支付宝客户端内的支付模块,此时会从商家网页应
用跳转到支付宝客户端中并开始支付;支付完成后会跳转回商家网页应用内,最后商家展示支付结果。

步骤1:用户在浏览器中访问商家网页应用,选择商品下单、确认购买,进入支付环节,选择支付宝付款,用户点
击去支付,如下图1;

步骤2:进入到支付宝支付路由页面,支付宝处理支付请求,并尝试唤起支付宝客户端,如下图2;

步骤3:进入到支付宝页面,调起支付宝客户端支付,出现确认支付界面,如下图3;

步骤4:用户确认收款方和金额,点击立即支付后出现输入密码界面,如下图4;

步骤5:输入正确密码后,支付宝端显示支付结果,如下图5;

步骤6:自动回跳到浏览器中,商家根据付款结果个性化展示订单处理结果,如下图6。

4.2 接口交互图

手机网站支付接入详细参见:https://docs.open.alipay.com/203/105285/

接口交互流程如下:

1、用户在商户的H5网站下单支付后,商户系统按照手机网站支付接口alipay.trade.wap.payAPI的参数规范生成订
单数据

2、前端页面通过Form表单的形式请求到支付宝。此时支付宝会自动将页面跳转至支付宝H5收银台页面,如果用
户手机上安装了支付宝APP,则自动唤起支付宝APP。

3、输入支付密码完成支付。

4、用户在支付宝APP或H5收银台完成支付后,会根据商户在手机网站支付API中传入的前台回跳地址return_url自
动跳转回商户页面,同时在URL请求中以Query String的形式附带上支付结果参数,详细回跳参数见“手机网站支付
接口alipay.trade.wap.pay”前台回跳参数。

5、支付宝还会根据原始支付API中传入的异步通知地址notify_url,通过POST请求的形式将支付结果作为参数通知
到商户系统,详情见支付结果异步通知。

4.3 下单接口定义

接口定义:外部商户请求支付宝创建订单并支付

公共参数

请求地址:

开发中使用沙箱地址:https://openapi.alipaydev.com/gateway.do

公共请求参数:

详细参数参见:https://docs.open.alipay.com/203/107090/

https://docs.open.alipay.com/api_1/alipay.trade.wap.pay
标记蓝色的由支付宝sdk(开发工具包)设置、标记红色的已在支付渠道参数中配置,标记绿色的需程序来设置。

业务参数如下:

响应code说明文档:

https://opendoc.alipay.com/common/02km9f

4.4 下单接口测试

本节测试支付宝下单接口,使用支付宝提供sdk(开发工具包)调用支付宝的接口。

sdk是一个方便调用支付宝接口的开发工具包,提供方便接口调用的api方法。

下图展现在sdk的位置,惠民平台微服务需要引入sdk依赖(jar包),即可使用sdk的api

4.4.1 准备环境

1、在交易服务中引入支付宝的sdk作为测试战场,在交易服务pom.xml中添加如下坐标:

**开发工具包SDK:**https://opendocs.alipay.com/common/02n6z6

放到huiminpay父pom.xml中

<!-- 最新版支付宝SDK -->
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.38.61.ALL</version>
     <type>pom</type>
     <scope>import</scope>
</dependency>

放到huiminpay-transaction-service的pom.xml文件中

<!-- 支付宝SDK -->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
        </dependency>
        <!--支付宝SDK依赖的日志 -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>

2、必要的参数

如下参数是支付宝接口交互中的必要参数:appId、应用私钥、支付宝公钥,以下参数请学习者自行申请。

String APP_ID = "2016091100486396";
String APP_PRIVATE_KEY ="MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQC4AT65TEOy/6uk94SYlFUzu8WVrHH38CzvLV4n4FtB6UwZcnFTFYmHV5E0zJrkh2Ga4aTHIIU8LYLYeWwXl45z3naxxM5v72X2+pz4oLa2lFEKefbQ4huHWsAk/lW7ATb7paRVj4HZl6aT4VFG1mxmMpP+r40baLgUAoZVhAG+KC/0GNX6rvrX01CUD2kMcd3B3scKTt33A7K2dYSULmiXgJ2K+OB/8VYcsnLjpciaOce3huw7p9JAo5xQCql6JTyORRPMaLacebrf/NX4t7s2hFMyhtWUtw6VrzAME8y8wfo3Y1SASgcRxz/Zn78GfGuJQGitCd3gM/aeG+CneZXlAgMBAAECggEBAKzIXoHZX2jiM+eAlX5BK5CcrfjSKWLMoSUm0NdZEdhenhr3H/sIqk/wpmWSC5C0n660W+qwWuwbQFbODfZJVnbvWz2qtL7fajv1MRk2sNvZgg/4Xw/egkMjsHIMcaxcg6jh7eJ6E1Cj2sPaPFvsVXXR4K6zYiluuAvyIvqCLrDDqWtnzG6SKOq5SIFWNNldqvgFoEUO1FFNPfgUYbiExhYIgNEaunC2RmhKWk15bvR3Fx0eSY7dHlxAfh/YFqx9KUAINDSMS9hkqJ5IDV+LB8eluAyxfQ7Fw+0zs4vCPVbirW76bbPJAurPpaDwpgvFK9IPiAOXexRhx4/NvQomhbECgYEA9FUCyDOuWEKHL5Uz6JXa0ZLRytEOs/pwAMu4NjwJ6LsLvSXYxh7NHON4YMmFPVPP/QTQ4G268Oe/tAnE932t/4w427AgHfRjnN78B65DVJ/bXrjfgQZgs+FPMzO1eExfEoLacr3LYmDK0uaTuuMd3nKn4/ddjYB5DCtZYm1rm58CgYEAwMq6CZ/OM+BZcZp55sxoEpmCIG/VDJ4B9/KM4Jo9w59cozAdE5fEKrhEU5ifUbo7nmLRktAtWoLPZcCQYT+fstPzNXpx5OVzekqdJx1X1VjatWax2xpDtO2/8e6O6bD/bq26zDxNQy8i/osXCSlc44z9NmhNF1WChkV6X6TIX/sCgYEA4y68ZHyxan2Jh3PbDTNxgBZdHZFfc3e0dvj1cvBGYnCxDJHJSwZOv8K+JniafBiXNvMoaNV+0gsaVAQVce4ZQJkYMSVF57Rafv1TKK0fC+uLpTqPD0Bn4DnqU3iMDqwsZmDnT3MsTnAjhxBAYrBVEIZZl31lLnI7m1YfSYbmXI8CgYEAt5xbse7Qo/d3OAq3LmheddhdZicb8PhLR6lpIj/DsxuDTqf0CUTxPv5flH42vc9wGFhk4D4D87/BZlcPKo89uULCzpve/PDKGh4Vrbr0e+wz36/+k31gHmCP/goFcetwWih7TyffLa0m1uYA+mi6Xr1YKwkK4r49oUNqWMzHSSECgYEAvHTZUzqF5F2JjtkrEXLBzZxgY8o1LhxCREHry14YyKfsI+WF/ARuV1KGhY8hNr55dCKG1M2xxQwRjHHfdxtfQZR9oPMtKo8E421XrXOpDIXFw0oS9On0Y8mqTbXx1ltoklRZZXdyh00LOSVGIWlnK62N/LhMOKfggel5JhLzgSI="
String ALIPAY_PUBLIC_KEY ="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy6NBr7b3dt0CC6UvA/4GqmTF/GGxBKagSkV6U/0VO+M8VngmoizKoDE+uq730k8go4m1GNMLEFH/5ASeDWwBHlRZQtM34/NFbXou4aM17IajH/9OBArGwSF9oX/48UowFvnKCZF1hnsgmQCP4dxb/KiotOvWn4TJjuRnglRwSEXhsYr4Ki22pPGRT0kHOx5+5Nkp3YLb20R1pHzuwIx55TZ7U3YYPAMU8PQ3IYnUA4j4f8lNiXBaFTqgxqFhO6Cs6pefhDtEVOPrbz/IfFaWUwtDVxsgm0rhDVeqHvw1lB8LTdFmGMHceDPMMSuEgsLu3W5YoKiy289AQev6E3R3AQIDAQAB"

4.4.2 编写下单接口

1、首先参考sdk代码示例如下:

详细见:https://docs.open.alipay.com/203/105285/

public void doPost(HttpServletRequest httpRequest,
HttpServletResponse httpResponse) throws ServletException, IOException {
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2"); //获得初始化的AlipayClient
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的request
alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp");
alipayRequest.setNotifyUrl("http://domain.com/CallBack/notify_url.jsp");//在公共参数中设置回跳和通知地址
alipayRequest.setBizContent("{" +
" \"out_trade_no\":\"20150320010101002\"," +
" \"total_amount\":\"88.88\"," +
" \"subject\":\"Iphone6 16G\"," +
" \"product_code\":\"QUICK_WAP_PAY\"" +
" }");//填充业务参数
String form="";
try {
form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
} catch (AlipayApiException e) {
e.printStackTrace();
}
httpResponse.setContentType("text/html;charset=" + CHARSET);
httpResponse.getWriter().write(form);//直接将完整的表单html输出到页面
httpResponse.getWriter().flush();
httpResponse.getWriter().close();
}

2、在transaction交易服务新建Controller:

注意:根据sdk代码示例,支付宝下单接口向前端响应html页面,此controller使用@Controller注解,不要使用
@RestController注解。

package com.huiminpay.transaction.controller;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.huiminpay.common.util.QRCodeUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
* @ClassName : PayTestController
* @Author : glls
* @Date: 2021/3/1 22:07
* @Description :
*/
@Slf4j
@Controller
public class PayTestController {
   String APP_ID = "2016091100486396"; //APP ID
   //应用私钥
   String APP_PRIVATE_KEY ="MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQC4AT65TEOy/6uk94SYlFUzu8WVrHH38CzvLV4n4FtB6UwZcnFTFYmHV5E0zJrkh2Ga4aTHIIU8LYLYeWwXl45z3naxxM5v72X2+pz4oLa2lFEKefbQ4huHWsAk/lW7ATb7paRVj4HZl6aT4VFG1mxmMpP+r40baLgUAoZVhAG+KC/0GNX6rvrX01CUD2kMcd3B3scKTt33A7K2dYSULmiXgJ2K+OB/8VYcsnLjpciaOce3huw7p9JAo5xQCql6JTyORRPMaLacebrf/NX4t7s2hFMyhtWUtw6VrzAME8y8wfo3Y1SASgcRxz/Zn78GfGuJQGitCd3gM/aeG+CneZXlAgMBAAECggEBAKzIXoHZX2jiM+eAlX5BK5CcrfjSKWLMoSUm0NdZEdhenhr3H/sIqk/wpmWSC5C0n660W+qwWuwbQFbODfZJVnbvWz2qtL7fajv1MRk2sNvZgg/4Xw/egkMjsHIMcaxcg6jh7eJ6E1Cj2sPaPFvsVXXR4K6zYiluuAvyIvqCLrDDqWtnzG6SKOq5SIFWNNldqvgFoEUO1FFNPfgUYbiExhYIgNEaunC2RmhKWk15bvR3Fx0eSY7dHlxAfh/YFqx9KUAINDSMS9hkqJ5IDV+LB8eluAyxfQ7Fw+0zs4vCPVbirW76bbPJAurPpaDwpgvFK9IPiAOXexRhx4/NvQomhbECgYEA9FUCyDOuWEKHL5Uz6JXa0ZLRytEOs/pwAMu4NjwJ6LsLvSXYxh7NHON4YMmFPVPP/QTQ4G268Oe/tAnE932t/4w427AgHfRjnN78B65DVJ/bXrjfgQZgs+FPMzO1eExfEoLacr3LYmDK0uaTuuMd3nKn4/ddjYB5DCtZYm1rm58CgYEAwMq6CZ/OM+BZcZp55sxoEpmCIG/VDJ4B9/KM4Jo9w59cozAdE5fEKrhEU5ifUbo7nmLRktAtWoLPZcCQYT+fstPzNXpx5OVzekqdJx1X1VjatWax2xpDtO2/8e6O6bD/bq26zDxNQy8i/osXCSlc44z9NmhNF1WChkV6X6TIX/sCgYEA4y68ZHyxan2Jh3PbDTNxgBZdHZFfc3e0dvj1cvBGYnCxDJHJSwZOv8K+JniafBiXNvMoaNV+0gsaVAQVce4ZQJkYMSVF57Rafv1TKK0fC+uLpTqPD0Bn4DnqU3iMDqwsZmDnT3MsTnAjhxBAYrBVEIZZl31lLnI7m1YfSYbmXI8CgYEAt5xbse7Qo/d3OAq3LmheddhdZicb8PhLR6lpIj/DsxuDTqf0CUTxPv5flH42vc9wGFhk4D4D87/BZlcPKo89uULCzpve/PDKGh4Vrbr0e+wz36/+k31gHmCP/goFcetwWih7TyffLa0m1uYA+mi6Xr1YKwkK4r49oUNqWMzHSSECgYEAvHTZUzqF5F2JjtkrEXLBzZxgY8o1LhxCREHry14YyKfsI+WF/ARuV1KGhY8hNr55dCKG1M2xxQwRjHHfdxtfQZR9oPMtKo8E421XrXOpDIXFw0oS9On0Y8mqTbXx1ltoklRZZXdyh00LOSVGIWlnK62N/LhMOKfggel5JhLzgSI=";
   //支付宝公钥:::并不是应用公钥
   String ALIPAY_PUBLIC_KEY ="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy6NBr7b3dt0CC6UvA/4GqmTF/GGxBKagSkV6U/0VO+M8VngmoizKoDE+uq730k8go4m1GNMLEFH/5ASeDWwBHlRZQtM34/NFbXou4aM17IajH/9OBArGwSF9oX/48UowFvnKCZF1hnsgmQCP4dxb/KiotOvWn4TJjuRnglRwSEXhsYr4Ki22pPGRT0kHOx5+5Nkp3YLb20R1pHzuwIx55TZ7U3YYPAMU8PQ3IYnUA4j4f8lNiXBaFTqgxqFhO6Cs6pefhDtEVOPrbz/IfFaWUwtDVxsgm0rhDVeqHvw1lB8LTdFmGMHceDPMMSuEgsLu3W5YoKiy289AQev6E3R3AQIDAQAB";
   String CHARSET = "utf-8";
   String serverUrl = "https://openapi.alipaydev.com/gateway.do";//正式"https://openapi.alipay.com/gateway.do"

   @GetMapping("/alipaytest")
   public void alipaytest(HttpServletRequest httpRequest, HttpServletResponse httpResponse)
           throws IOException {
       AlipayClient alipayClient = new DefaultAlipayClient(serverUrl, APP_ID, APP_PRIVATE_KEY,
               "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2"); //获得初始化的AlipayClient
       AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的request
       alipayRequest.setBizContent("{" +
               " \"out_trade_no\":\"20150320010101123\"," +
               " \"total_amount\":\"0.01\"," +
               " \"subject\":\"Iphone6 16G\"," +
               " \"product_code\":\"QUICK_WAP_PAY\"" +
               " }");//填充业务参数
       String form="";
       try {
           form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
       } catch (AlipayApiException e) {
           e.printStackTrace();
       }
       httpResponse.setContentType("text/html;charset=" + CHARSET);
       httpResponse.getWriter().write(form);//直接将完整的表单html输出到页面
       httpResponse.getWriter().flush();
       httpResponse.getWriter().close();
   }

   public static void main(String[] args) throws IOException {

       QRCodeUtil qrCodeUtil = new QRCodeUtil();
       //改为自己电脑的ip地址
       System.out.println(qrCodeUtil.createQRCode("http://192.168.10.101:56050/transaction/alipaytest",
               200, 200));

   }
}

在这里插入图片描述

5 下单测试

5.1 生成二维码

指定二维码的URL,模拟器必须可以访问到此地址,由于模拟器在开发机安装,URL使用局域网ip即可。

进入cmd命令状态,输入以下命令查看ip地址:

ipconfig -all

二维码的URL为:http://192.168.159.1:56050/transaction/alipaytest

添加工具类QRCodeUtil.java
package com.huiminpay.transaction.common.util;

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.huiminpay.common.cache.domain.BusinessException;
import com.huiminpay.common.cache.domain.CommonErrorCode;
import com.huiminpay.common.cache.util.EncryptUtil;
import org.apache.commons.lang3.StringUtils;

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

/**
 * <P>
 * 二维码工具类
 * </p>
 */
public class QRCodeUtil {
	/**
	 * 生成二维码
	 * @param content
	 * @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, Comparable> hints = new HashMap<>();
			//指定字符编码为“utf-8”
			hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
			//L M Q H四个纠错等级从低到高,指定二维码的纠错等级为M
			//纠错级别越高,可以修正的错误就越多,需要的纠错码的数量也变多,相应的二维吗可储存的数据就会减少
			hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
			//设置图片的边距
			hints.put(EncodeHintType.MARGIN, 1);

			try {
				//zxing生成二维码核心类
				QRCodeWriter writer = new QRCodeWriter();
				//把输入文本按照指定规则转成二维吗
				BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
				//生成二维码图片流
				BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
				//输出流
				ImageIO.write(bufferedImage, "png", os);
				/**
				 * 原生转码前面没有 data:image/png;base64 这些字段,返回给前端是无法被解析,所以加上前缀
				 */
				resultImage = new String("data:image/png;base64," + EncryptUtil.encodeBase64(os.toByteArray()));
				return resultImage;
			} catch (Exception e) {
				e.printStackTrace();
				throw new BusinessException(CommonErrorCode.E_200007);
			} finally {
				if (stream != null) {
					stream.flush();
					stream.close();
				}
			}
		}
		return null;
	}

}

执行下边的代码生成二维码:

public static void main(String[] args) throws IOException {
      QRCodeUtil qrCodeUtil = new QRCodeUtil();
    //改为自己电脑的ip地址
      System.out.println(qrCodeUtil.createQRCode("http://172.16.8.100:56050/transaction/alipaytest",
              200, 200));
  }

5.2 扫码测试

使用支付宝沙箱买家账号登录支付宝客户端(沙箱版)

点击扫一扫

选择相册中的二维码图片:

打开支付宝客户端,进行支付

支付成功,到此下单测试完成。

注意:再次测试需要修改下单请求的订单号,因为此订单号在支付宝已存在,实际开发中的订单号是每次支付都生
成,无需此操作。

@GetMapping("alipayTest")
    public void alipayTest(HttpServletRequest request, HttpServletResponse response) throws IOException {
        log.info("[{}]",env.getProperty("server.port"));
        log.info("[{}]",env.getProperty("server.servlet.context-path"));
        AlipayClient alipayClient = new DefaultAlipayClient(serverUrl, APP_ID, APP_PRIVATE_KEY,
                "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2"); //获得初始化的AlipayClient
        AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的request
        alipayRequest.setBizContent("{" +
                " \"out_trade_no\":\"202104071407010101123\"," +
                " \"total_amount\":\"999999\"," +
                " \"subject\":\"Iphone120 16T\"," +
                " \"product_code\":\"QUICK_WAP_PAY\"" +
                " }");//填充业务参数
        String form="";
        try {
            form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        response.setContentType("text/html;charset=" + CHARSET);
        response.getWriter().write(form);//直接将完整的表单html输出到页面
        response.getWriter().flush();
        response.getWriter().close();

    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/946559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Axure RP 8.1.0.3400(原型设计工具)

Axure RP 8是一款原型设计工具&#xff0c;它提供了丰富的功能和工具&#xff0c;帮助用户创建高质量的网页、移动应用和桌面软件原型。以下是Axure RP 8的一些特色介绍&#xff1a; 强大的交互设计&#xff1a;Axure RP 8支持创建复杂的动画和过渡效果&#xff0c;让你的原型更…

一文彻底扒光 Handler

作者&#xff1a;HenAndroid 典型的生产者-消费者模式。 Android跨进程要掌握的是Binder, 而同一进程中最重要的应该就是Handler 消息通信机制了。我这么说&#xff0c;大家不知道是否认同&#xff0c;如果认同&#xff0c;还希望能给一个关注哈。 Handler 是什么&#xff1f;…

AI智能语音识别模块(一)——离线模组介绍

文章目录 离线语音控制模块简介引脚定义开发平台总结 离线语音控制模块 简介 这是一款低成本&#xff0c;低功耗&#xff0c;小体积的高性价比离线语音识别开发板。能快速学习、验证离线语音控制各种外设&#xff0c;如继电器、LED灯&#xff0c;PWM调光等。 板载了Micro USB接…

MySQL DATE_SUB的实践

函数简介DATE_SUB()函数从DATE或DATETIME值中减去时间值(或间隔)。 下面说明了DATE_SUB()函数的语法&#xff1a; DATE_SUB(start_date,INTERVAL expr unit); DATE_SUB()函数接受两个参数&#xff1a; start_date是DATE或DATETIME的起始值。 expr是一个字符串&#xff0c;用于确…

哪个牌子的电视盒子好用?小编盘点复购率最高电视盒子排行榜

复购率可以体现出产品评价如何&#xff0c;电视盒子是我们经常要购买的数码产品&#xff0c;那么电视盒子哪些品牌的复购率最高&#xff1f;用户忠实度最高呢&#xff1f;想了解哪个牌子的电视盒子好用&#xff0c;可以看看小编根据复购情况整理的电视盒子排行榜&#xff1a; ●…

Weblogic漏洞(三)之 Weblogic 弱口令、任意文件读取漏洞

Weblogic 弱口令、任意文件读取漏洞 环境安装 此次我们实验的靶场&#xff0c;是vnlhub中的Weblogic漏洞中的weak_password靶场&#xff0c;我们 cd 到weak_password&#xff0c;然后输入以下命令启动靶场环境&#xff1a; docker-compose up -d输入以下的命令可以查看当前启…

问道管理:仙人指路最佳买入形态?

仙人指路是一种基于技能剖析的股票交易目标。许多投资者运用该目标来预测股票价格的上涨或下跌趋势。在买入股票时&#xff0c;仙人指路能够为投资者供给有用的信息&#xff0c;协助他们找到最佳的买入形状。本文将从多个视点剖析仙人指路的最佳买入形状。 一、仙人指路的基本原…

适合本地运营的同城团购优质商家圈子小程序开发演示

很火的一款适合本地同城运营的同城团购商家圈子小程序。有很多城市都有在用这个小程序做同城资源&#xff0c;实现完美变现。 小程序功能就是将本地商家邀请入驻&#xff0c;以团购的形式出售商家产品或服务套餐。借助微信的社交属性配合同城推广员可以迅速推广起来。 对于商…

网络安全法+网络安全等级保护

网络安全法 网络安全法21条 网络安全法31条 网络安全等级保护 网络安全等级保护分为几级? 一个中心&#xff0c;三重防护 等级保护2.0网络拓扑图 安全区域边界 安全计算环境 等保安全产品 物理机房安全设计

Autofac中多个类继承同一个接口,如何注入?与抽象工厂模式相结合

多个类继承同一个接口,如何注入&#xff1f;与抽象工厂模式相结合 需求: 原来是抽象工厂模式,多个类继承同一个接口。 现在需要使用Autofac进行选择性注入。 Autofac默认常识: Autofac中多个类继承同一个接口,默认是最后一个接口注入的类。 解决方案&#xff1a;(约定大于配…

nodepad++ 插件的安装

nodepad 插件的安装 一、插件安装二、安装插件&#xff1a;Json Viewer nodepad 有 插件管理功能&#xff0c;其中有格式化json以及可以将json作为树查看的插件&#xff1a; Json Viewer 一、插件安装 1、首先下载最新的notepad 64位【https://notepad-plus.en.softonic.com…

Java——一个简单的计算器程序

该代码是一个简单的计算器程序&#xff0c;使用了Java的图形化界面库Swing。具体分析如下&#xff1a; 导入必要的类和包&#xff1a; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Objects; import javax.…

Java 中数据结构HashMap的用法

Java HashMap HashMap 是一个散列表&#xff0c;它存储的内容是键值对(key-value)映射。 HashMap 实现了 Map 接口&#xff0c;根据键的 HashCode 值存储数据&#xff0c;具有很快的访问速度&#xff0c;最多允许一条记录的键为 null&#xff0c;不支持线程同步。 HashMap 是…

打通数字化供需“堵点”,828 B2B企业节推出企业应用一站购平台

当前&#xff0c;数字技术与实体经济深度融合&#xff0c;为千行百业注入新动力、拓展新空间。数据显示&#xff0c;2022年中国数字经济规模超过50万亿&#xff0c;占GDP比重超过40%&#xff0c;继续保持在10%的高位增长速度&#xff0c;成为稳定经济增长的关键动力。 为加速企…

智慧校园用电安全解决方案

随着科技的不断发展&#xff0c;智慧校园建设逐渐成为了教育行业的一大趋势。在这个过程中&#xff0c;电力系统作为校园基础设施的重要组成部分&#xff0c;其安全、稳定、高效的运行显得尤为重要。下面小编来为大家介绍下智慧校园用电安全解决方案吧! 一、智慧校园电力系统现…

腾讯云学生服务器优惠价格申请教程

腾讯云学生服务器优惠价格申请教程&#xff0c;腾讯云学生服务器活动&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&#x…

SimpleMind Pro(电脑版思维导图软件)中文版

Simplemind pro是一款极具创意和高效的可视化思维导图工具&#xff0c;它的设计和功能让它在众多思维导图软件中脱颖而出。本文将向您介绍Simplemind pro的特点、使用方法、适用场景以及与其他思维导图软件的比较&#xff0c;帮助您更好地了解Simplemind pro的优势和使用价值。…

文旅虚拟人主播智能讲解员能与人实时对话

元宇宙作为虚拟世界和现实社会交互的重要平台&#xff0c;是数字经济的表现形态之一&#xff0c;在文化和旅游领域拥有广阔的应用空间&#xff0c;也是当下该领域的热门赛道。 众多文旅行业从业者纷纷以“文化科技旅游”的方式&#xff0c;努力探索合适形态的应用场景和商业机会…

EMQX启用双向SSL/TLS安全连接以及java连接

作为基于现代密码学公钥算法的安全协议&#xff0c;TLS/SSL 能在计算机通讯网络上保证传输安全&#xff0c;EMQX 内置对 TLS/SSL 的支持&#xff0c;包括支持单/双向认证、X.509 证书、负载均衡 SSL 等多种安全认证。你可以为 EMQX 支持的所有协议启用 SSL/TLS&#xff0c;也可…

一文2500字使用Python进行GRPC和Dubbo协议的高级测试

01、GRPC测试 GRPC&#xff08;Google Remote Procedure Call&#xff09;是一种高性能、开源的远程过程调用&#xff08;RPC&#xff09;框架&#xff0c;由 Google开发并基于Protocol Buffers&#xff08;protobuf&#xff09;进行通信。它使用了HTTP/2协议作为传输层&#x…