一、前言

支付宝支付—沙箱环境使用

支付宝新版SDK-PC端扫码支付 + 手机浏览器H5支付「本文

PC端扫码支付,其实就是就是 电脑网站支付,本文基于支付宝沙箱环境,不了解的可以看一下上边的链接。

PS:本文是基于支付宝新版 SDK 重写的,用法非常简单,之前的旧版 SDK 就别参考了~

本文环境:

  • JDK1.8
  • IDEA 2020.3.2
  • SpringBoot 2.2.2
  • alipay-easysdk 2.2.0
  • 支付宝沙箱环境

二、引入依赖

源码地址:https://github.com/niceyoo/alipay-demo

创建一个 SpringBoot 应用(有基础的建议直接看↑源码),在 pom 中引入如下依赖:

<!-- alipay -->
<dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-easysdk</artifactId><version>2.2.0</version>
</dependency>

在 application.yml 文件中添加如下配置:

## 支付宝配置
alipay:# 应用IDappId: 你的appid# 应用私钥privateKey: 你的应用私钥privateKey# 支付宝公钥,注意不是生成的应用公钥publicKey: 你的支付宝公钥publicKey#支付网关配置,这一项是写死的,正式环境是openapi.alipay.comgateway: openapi.alipaydev.com# 支付宝前台跳转地址returnUrl: http://ngrok.sscai.club/html/success# 支付宝后台通知地址notifyUrl: http://ngrok.sscai.club/api/alipay/notify_url# 支付宝前台手机网页支付中途取消跳转地址errorUrl: http://ngrok.sscai.club/html/error

这些参数在哪里获取的?

1、appId(应用ID)

https://open.alipay.com/platform/appDaily.htm?tab=info

具体见下图所示:

2、publicKey、privateKey(支付宝公钥、应用私钥)

windows工具:点击此链接

macos工具:点击此链接

这块参考这篇文章的第三节吧:https://www.cnblogs.com/niceyoo/p/12196095.html

3、gateway(支付网关配置)

测试环境:openapi.alipaydev.com

正式环境:openapi.alipay.com

4、returnUrl、notifyUrl、errorUrl(跳转地址)

这三个地址在测试环境,可以使用内网映射的地址,尤其是 notifyUrl ,这个是支付宝的回调 URl,必须外网可访问。

内网映射可以使用免费的 natapp

natapp链接:https://natapp.cn/

具体用法可自行百度。

内网映射就是将内网映射到外网,实现通过外网链接访问本地的效果。
例如上方的:http://ngrok.sscai.club 指向我本地的 http://127.0.0.1:port

三、代码部分

1、支付宝参数配置类

上面定义的参数有了,接下来就是如何使用了。新增一个配置类(AlipayConfig):

import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;/*** @author : niceyoo* @version : 1.0* @title : AlipayApplication* @description : 支付宝支付配置类* @copyright :* @date :*/
@Component
public class AlipayConfig implements ApplicationRunner {/*** 应用id*/@Value("${alipay.appId}")private String appId;/*** 私钥*/@Value("${alipay.privateKey}")private String privateKey;/*** 公钥*/@Value("${alipay.publicKey}")private String publicKey;/*** 支付宝网关*/@Value("${alipay.gateway}")private String gateway;/*** 支付成功后的接口回调地址,不是回调的友好页面,不要弄混了*/@Value("${alipay.notifyUrl}")private String notifyUrl;/***  项目初始化事件* */@Overridepublic void run(ApplicationArguments args) throws Exception {/**初始化支付宝SDK**/Factory.setOptions(getOptions());System.out.println("**********支付宝SDK初始化完成**********");}private Config getOptions() {/**这里省略了一些不必要的配置,可参考文档的说明**/Config config = new Config();config.protocol = "https";config.gatewayHost = this.gateway;config.signType = "RSA2";config.appId = this.appId;/** 为避免私钥随源码泄露,推荐从文件中读取私钥字符串而不是写入源码中 **/config.merchantPrivateKey = this.privateKey;/** 注:如果采用非证书模式,则无需赋值上面的三个证书路径,改为赋值如下的支付宝公钥字符串即可 **/config.alipayPublicKey = this.publicKey;/** 可设置异步通知接收服务地址(可选)**/config.notifyUrl = notifyUrl;return config;}
}

PS:详细的参数文档:https://opendocs.alipay.com/apis/00y8k9

2、模拟订单Controller类
/*** @author : niceyoo* @version : 1.0* @title : AlipayController* @description : 订单支付控制层-测试代码* @copyright :* @date :*/
@RestController
@RequestMapping("/api/alipay")
public class AlipayController {@Autowiredprivate AlipayService alipayService;/*** @description: 支付宝电脑网页支付* @param subject: 订单名称* @param total: 金额* @return java.lang.String*/@PostMapping("/page")public String page(String subject, String total) {subject = "测试支付";total = "1000";return alipayService.page(subject, total);}/*** @description: 支付宝手机网页支付* @param subject: 订单名称* @param total: 金额* @return java.lang.String*/@PostMapping("/wap")public String wap(String subject, String total) {subject = "测试支付";total = "1000";return alipayService.wap(subject, total);}/*** @description: 支付宝异步回调* @param request: 请求* @return java.lang.String*/@PostMapping("/notify_url")public String notify_url(HttpServletRequest request) throws Exception {if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) {System.out.println("=========支付宝异步回调========");Map<String, String> params = new HashMap<>();Map<String, String[]> requestParams = request.getParameterMap();for (String name : requestParams.keySet()) {params.put(name, request.getParameter(name));}/** 支付宝验签 **/if (Factory.Payment.Common().verifyNotify(params)) {/** 验签通过 **/System.out.println("交易名称: " + params.get("subject"));System.out.println("交易状态: " + params.get("trade_status"));System.out.println("支付宝交易凭证号: " + params.get("trade_no"));System.out.println("商户订单号: " + params.get("out_trade_no"));System.out.println("交易金额: " + params.get("total_amount"));System.out.println("买家在支付宝唯一id: " + params.get("buyer_id"));System.out.println("买家付款时间: " + params.get("gmt_payment"));System.out.println("买家付款金额: " + params.get("buyer_pay_amount"));}}return "success";}/*** @description: 支付宝退款* @param outTradeNo: 商家订单号* @param refundAmount: 退款金额(不能大于交易金额)* @return java.lang.String*/@PostMapping("/refund")public String refund(String outTradeNo, String refundAmount) {return alipayService.refund(outTradeNo, refundAmount);}}

订单 Controller 类主要模拟了四个方法:

  • page:网站支付
  • wap:手机支付
  • notify_url:支付回调方法
  • refund:退款调用方法
3、模拟订单Service类
/*** @author : niceyoo* @version : 1.0* @title : AlipayService* @description :* @copyright :* @date : 2021/2/8 12:27*/
@Service
public class AlipayService {/*** 支付成功后要跳转的页面*/@Value("${alipay.returnUrl}")private String returnUrl;/*** 支付宝前台手机网页支付中途取消跳转地址*/@Value("${alipay.errorUrl}")private String errorUrl;/**** @param subject* @param total* @return*/public String page(String subject, String total) {try {AlipayTradePagePayResponse response = Factory.Payment/** 选择电脑网站 **/.Page()/** 调用支付方法(订单名称, 商家订单号, 金额, 成功页面) **/.pay(subject, OrderUtil.getOrderNo(), total, returnUrl);return response.body;} catch (Exception e) {e.printStackTrace();}return null;}/**** @param subject* @param total* @return*/public String wap(String subject, String total) {try {AlipayTradeWapPayResponse response = Factory.Payment/** 选择手机网站 **/.Wap()/** 调用支付方法(订单名称, 商家订单号, 金额, 中途退出页面, 成功页面) **/.pay(subject, OrderUtil.getOrderNo(), total, errorUrl, returnUrl);return response.body;} catch (Exception e) {e.printStackTrace();}return null;}/**** @param outTradeNo* @param refundAmount* @return*/public String refund(String outTradeNo, String refundAmount) {try {AlipayTradeRefundResponse response = Factory.Payment.Common()/** 调用交易退款(商家订单号, 退款金额) **/.refund(outTradeNo, refundAmount);if (response.getMsg().equals("Success")) {return "退款成功";}} catch (Exception e) {e.printStackTrace();}return "退款失败";}}

Service 主要调用支付宝支付提供的便捷方法,大家可以看一下方法中的写法。

用到的模拟生成订单号的工具类:

public class OrderUtil {/***  根据时间戳生成订单号* */public static String getOrderNo () {DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");LocalDateTime localDateTime = Instant.ofEpochMilli(System.currentTimeMillis()).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();return df.format(localDateTime);}}

4、前端截图以及支付演示

由于使用了 thymeleaf,增加了三个前端界面:

  • 首页调用支付
  • 支付成功界面
  • 支付失败界面

首页主要就是 form 表单的提交,调用了两个方法:网页支付、手机网站支付

<form enctype="multipart/form-data" action="/api/alipay/page" method="post"><button type="submit">电脑确认支付</button>
</form>
<form enctype="multipart/form-data" action="/api/alipay/wap" method="post"><button type="submit">手机确认支付</button>
</form>

支付时需要用到沙箱账号,即支付宝沙箱版,下载链接如下,一个我的下载链接,一个官方的,哪个下载快用哪个。

https://niceyoo.lanzous.com/i7QFulh3uri

https://sandbox.alipaydev.com/user/downloadApp.htm

4.1、点击电脑确认支付:PC端支付截图

4.2、点击手机确认支付:手机端支付截图

PS:进行支付测试,注意付款要用沙箱环境提供的支付宝APK。且环境必须手机浏览器环境下,非PC端操作。

支付成功后会支付宝会调回调方法:(下图是我的代理调用截图)

至此,从以上看来,其实不难发现支付宝支付是非常简单的。

ok,这篇文章就到这结束了,上边并没有详细介绍接口调用、参数说明等,详细介绍请查看官方文档:https://docs.open.alipay.com/270/105902/

支付宝新版SDK-PC扫码支付-手机浏览器H5支付相关推荐

  1. 支付宝支付-手机浏览器H5支付

    前言 支付宝支付-沙箱环境使用 支付宝支付-支付宝PC端扫码支付 支付宝支付-手机浏览器H5支付「本文」 手机浏览器支付,用户在安装支付宝APP的情况下,调用手机网站支付接口默认会唤起支付宝钱包支付, ...

  2. 梦行扫码付(收银台条码支付 微信钱包条码支付 支付宝二维码支付 手机APP钱包支付 PHP扫码支付 )

    适用于:各行各业(如,超市 餐厅 收费站 等各类收费处) 平台管理员篇 扫码付管理 (收银台条码支付) 全站收款账号 (微信钱包条码支付) 全站收款记录 (支付宝二维码支付) 商家篇 我的扫码付 (支 ...

  3. 支付宝当面付之扫码支付“无效签名”

    做支付宝的当面付扫码支付的时候,遇到最纠结的问题就是一直提示"无效签名",然而官方又没有给出很明确的说明,在网上搜索了很长时间,也没有找到解决的具体例子,我就把我的经历说一下,有需 ...

  4. php qq钱包扫码接口,php最新版qq钱包扫码支付源码

    代码效果图 代码说明 php最新版qq钱包扫码支付源码,这套qq钱包扫码支付,经过云码素材修改,已经完全能正常使用,云码素材本站也在使用,如果你想测试一下,要以登录到会员中心,充值中使用qq钱包扫码支 ...

  5. 关于微信PC扫码支付

    关于微信PC扫码支付 扫码支付 有两种模式 官网有说  这里采用简单明白的模式2 前期准备  1 需要公众号 开通了微信支付权限 2 需要微信支付商户平台账号 服务器生成订单号 发送请求 https: ...

  6. 聚合支付二维码如何实现自动识别扫码客户端跳转相应支付页面

    前言 前面有一篇<聚合支付之流程概述>和大家聊了一下关于聚 合 支 付的一个简单流程.很多小伙伴私信我,如何实现聚合支付码的自动跳转呢? 其实,刚开始接触的时候我也很迷茫,一个静态的二维码 ...

  7. 微信PC扫码支付保证订单状态最终一致性

    目录 1.背景 2.实现方案 ​ 3.方案详解 4.注意事项 1.背景 系统需要对接微信PC扫码支付.订单的状态需要由系统来保证同步,不需要人工进行介入,所以,需要保证商户系统订单与微信订单最终一致性 ...

  8. 微信开发4——PHP实现PC扫码授权登陆获取用户信息

    首先须要申请,必须企业,个体工商户,媒体等,微信开放平台申请地址 https://open.weixin.qq.com/,要交300多的费用才能开通 1,编写入口:微信开放平台的扫码登陆开放的接口可以 ...

  9. php登陆网页版微信代码,几行php代码实现微信自动注册登陆 (微信PC扫码受权登陆注册)...

    最近做的一个商城项目中,要用到发货和收货人地址的功能,上面要求要用微信PC扫码授权登陆:自己试着用研究了好久写了一个,但是发现有好多兼容问题,具体实现步骤如下.微信PC扫码授权登陆 php简单示例代码 ...

最新文章

  1. 开源自动机器学习(AutoML)框架盘点
  2. 使用PHP导入Excel和导出数据为Excel文件
  3. 四川托普计算机职业学校里能拿什么快递,四川托普计算机职业学校怎么样_招生问答...
  4. PHP:验证邮箱合法性
  5. PHP5中的魔术方法
  6. 【渝粤题库】广东开放大学 计算机应用基础(本) 形成性考核
  7. 堪比“震网”:罗克韦尔PLC严重漏洞可导致攻击者在系统中植入恶意代码
  8. java数组使用实验报告_Java课程实验报告实验六——异常处理
  9. c++ 获取硬盘序列号serialnumber
  10. Windows XP虚拟机到期无法使用的解决方案(救急版)
  11. 【上位机教程】CANopen通信下一体化步进电机与台达PLC(AS228T)的应用
  12. 费马小定理 费马大定理 数论
  13. 负数除以正数余数如何求_负数除正数的余数是正还是负?-工业支持中心-西门子中国...
  14. esp32 io速度_Adafruit HUZZAH32-ESP32Feather的说明
  15. Unity 雨水滴到屏幕效果
  16. python爬取裁判文书并分析_裁判文书网爬虫攻克
  17. 微信奇销36计 赖老师
  18. 线性代数之——四个基本子空间
  19. PERCENT_RANK
  20. ppt html5转换,PPT还能转H5?这大概是制作招聘H5最快的方法了...

热门文章

  1. [html] 列举几种瀑布流布局的方法
  2. [css] 请使用css画一个圆,方法可以多种
  3. [js] 写一个方法,当给定数字位数不足8位时,则在左边补充0以补足8位数的方法
  4. 前端学习(2536) request和response
  5. 前端学习(619):变量的小案例二
  6. 前端学习(83):按显示进行分类
  7. spring mvc学习(46):自定义配置类
  8. 第八十二期:掌握这些监控报警优化技巧,百万年薪不在话下!
  9. 玩转oracle 11g(19):ora-00020和64位数据库安装32为plsql
  10. 机器学习算法总结--随机森林