之前在项目中使用过支付宝的沙箱测试支付和实际开发支付,是关于App对接支付宝接口的,由于前段时间有朋友询问怎么对接网页支付,通过研究支付包的开发文档,在这里总结一下对接支付宝的App支付接口和网页支付接口的具体细节。

前期准备
要先注册一个支付宝企业账号,获取appid,在支付宝平台获取支付宝公钥和自己的公钥与私钥,这些准备工作就不再这里具体操作

项目具体实现
1.搭建springboot项目框架
2.引入支付宝支付的sdk

 <dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>3.0.0</version></dependency>

3.创建支付宝配置文件pay.properties

#支付宝的支付网关
alipay_url=https://openapi.alipay.com/gateway.do
#商家appid,我们注册账号所得到的appid
app_id=XXXXXXX
#商家我们自己的私钥
app_private_key=这里是我们在支付宝开发平台生成的自己的私钥#支付宝的公钥
alipay_public_key=我们在支付宝开发平台获取的支付宝公钥# 同步回调地址 重定向地址本地浏览器,用户支付完之后,支付宝回调我们的接口,一定要加http获取https的完整路径,并且不能带参数
return_payment_url=http://localhost:8011/pay/ret# 异步通知地址 公网接口(webService)
notify_payment_url=http://60.205.215.91/alipay/callback/notify

4.创建支付配置文件,生成支付客户端bean

package com.pay.config;import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
/*** @param* @return*/
@Configuration
@PropertySource("classpath:alipay.properties")
public class AlipayConfig {@Value("${alipay_url}")private String alipay_url;@Value("${app_private_key}")private String app_private_key;@Value("${app_id}")private String app_id;//返回的数据格式public final static String format = "json";//使用的编码方式public final static String charset = "utf-8";//签名的加密算法public final static String sign_type = "RSA2";public static String return_payment_url;public static String notify_payment_url;public static String alipay_public_key;@Value("${alipay_public_key}")public void setAlipay_public_key(String alipay_public_key) {AlipayConfig.alipay_public_key = alipay_public_key;}@Value("${return_payment_url}")public void setReturn_url(String return_payment_url) {AlipayConfig.return_payment_url = return_payment_url;}@Value("${notify_payment_url}")public void setNotify_url(String notify_payment_url) {AlipayConfig.notify_payment_url = notify_payment_url;}/**
*生成的客户端bean
**/@Beanpublic AlipayClient alipayClient() {AlipayClient alipayClient = new DefaultAlipayClient(alipay_url, app_id, app_private_key, format, charset, alipay_public_key, sign_type);return alipayClient;}
}

5.下面就是就是我们要具体的实现支付宝支付的具体细节,也是最重要的部分,一定要每步都要自己看
(1).网页对接支付宝支付

@RestController
public class PayController {@AutowiredAlipayClient alipayClient;/*** @Author yyk* @Description //TODO 支付成功后的异步回调函数* @Date 2020/6/3 0:13* @Param [request, modelMap]* @return java.lang.String**/@RequestMapping("pay/return")public String reCall(HttpServletRequest request){// 回调请求中获取支付宝参数String sign = request.getParameter("sign");String trade_no = request.getParameter("trade_no");String out_trade_no = request.getParameter("out_trade_no");String trade_status = request.getParameter("trade_status");String total_amount = request.getParameter("total_amount");String subject = request.getParameter("subject");String call_back_content = request.getQueryString();// 通过支付宝的paramsMap进行签名验证,2.0版本的接口将paramsMap参数去掉了,导致同步请求没法验签if(sign!=null){// 验签成功System.out.println("验签成功");//做具体的业务请求}return "succsee";}/*** @Author yyk* @Description //TODO 请求支付接口* @Date 2020/6/3 0:06* @Param [request]* @return java.lang.String**/@RequestMapping("alipay/pay")public String alipay(HttpServletRequest request){String form="";//获取一个支付宝客户端AlipayTradePagePayRequest alipayTradePagePayRequest = new AlipayTradePagePayRequest();//把回调函数也放入里面alipayTradePagePayRequest.setReturnUrl(AlipayConfig.return_payment_url);alipayTradePagePayRequest.setNotifyUrl(AlipayConfig.notify_payment_url);Map<String,Object> map = new HashMap<>();//商户网站唯一订单号map.put("out_trade_no","1A4566776576");//销售产品码,商家和支付宝签约的产品码,注:目前仅支持FAST_INSTANT_TRADE_PAYmap.put("product_code","FAST_INSTANT_TRADE_PAY");//订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]。(,这里要与微信支付区分,微信支付单位为分)map.put("total_amount",0.01);//商品的标题/交易标题/订单标题/订单关键字等。map.put("subject","XXXXX");String param = JSON.toJSONString(map);//biz_content,请求参数的集合,最大长度不限,除公共参数外所有请求参数都必须放在这个参数中传递,具体参照各产品快速接入文档//下面我会具体介绍哪些是公共参数,哪些是请求参数alipayTradePagePayRequest.setBizContent(param);try {//最核心内容,其实跟App对接的区别也在这里,返回的是一个form表单支付成功后会跳到这个页面form = alipayClient.execute(alipayTradePagePayRequest).getBody();System.out.println(form);} catch (AlipayApiException e) {e.printStackTrace();}return form;}
}

当执行完alipay/pay支付接口时会出现下面的页面,支付之后,会回调pay/return接口,同时调用异步接口,这里没有写。在同步回调接口中2.0版本以后不再进行验签,但是异步回调一定要验签。并且异步回调返回给支付宝的结果一定是sucess
注意:异步接口必须是公网能访问的

请求时的公共参数和请求参数
公共参数就是我们在AlipayConfig类中配置的那些属性值
请求参数是我们在controller中传入到biz_content中的参数
具体参数请参考支付宝开发文档
https://opendocs.alipay.com/apis/api_1/alipay.trade.page.pay#%E5%85%AC%E5%85%B1%E5%8F%82%E6%95%B0

(2).对接App接口

  /*** @Author yyk* @Description //TODO 请求app支付接口* @Date 2020/6/3 0:36* @Param []* @return java.lang.String**/@RequestMapping("/app")public String appAlipay(HttpServletRequest request){//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay,这里和网页接口是由区别的**AlipayTradeAppPayRequest aliPayRequest = new AlipayTradeAppPayRequest();**//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();model.setSubject(subject);model.setOutTradeNo("q23er56gg");model.setTimeoutExpress("30m");model.setTotalAmount(String.valueOf(orderPrice));// 单位:元model.setProductCode("QUICK_MSECURITY_PAY");aliPayRequest.setBizModel(model);//回调接口aliPayRequest.setReturnUrl(AlipayConfig.return_payment_url);aliPayRequest.setNotifyUrl(AlipayConfig.notify_payment_url);try {//这里和普通的接口调用不同,使用的是sdkExecuteAlipayTradeAppPayResponse response = alipayClient.sdkExecute(aliPayRequest);//把这个返回给前端,然后前端调支付宝接口String body1 = response.getBody();return body1;} catch (AlipayApiException e) {//e.printStackTrace();return null;}/*** @Author yyk* @Description //TODO 支付成功后的异步回调函数* @Date 2020/6/3 0:13* @Param [request, modelMap]* @return java.lang.String**/@RequestMapping("pay/return")public String reCall(HttpServletRequest request){// 回调请求中获取支付宝参数String sign = request.getParameter("sign");String trade_no = request.getParameter("trade_no");String out_trade_no = request.getParameter("out_trade_no");String trade_status = request.getParameter("trade_status");String total_amount = request.getParameter("total_amount");String subject = request.getParameter("subject");String call_back_content = request.getQueryString();//AlipaySignature.rsaCheck();// 通过支付宝的paramsMap进行签名验证,2.0版本的接口将paramsMap参数去掉了,导致同步请求没法验签boolean signVerified = false;try {//3.1调用SDK验证签名,params是我们获取的参数,alipayPublicKey是支付宝公钥signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.setAlipay_public_key,"UTF-8", "RSA2");} catch (AlipayApiException e) {e.printStackTrace();}
if(signVerified ){
system.out.println("验签通过");
}return "调用succsee";}}

对接支付宝App支付和网页支付接口详解相关推荐

  1. 微信机器人网页版接口详解

    微信网页版接口详解 本系列会讲述微信机器人技术的实现,第一讲主要了解微信网页版给我们提供的http接口,这一步是做一个基于微信网页版机器人的基础和难点. 本讲将微信网页版的主要接口罗列出,并给出了入参 ...

  2. java SpringBoot 对接支付宝 APP支付 证书模式及非证书模式

    一. 添加maven依赖 sdk <dependency><groupId>com.alipay.sdk</groupId><artifactId>al ...

  3. 对接微信支付之网页支付详解

    对接微信支付之网页支付详解 声明:转载请注明出处 阅读对象:本文针对的是网页中的扫码支付 温馨提示:微信支付坑比较多,阅读时请仔细一些,不要放过所有需要注意的内容 , 本人一路踩坑过来,希望大家引以为 ...

  4. 新版支付宝开放平台 手机网页支付 整个流程

    新版支付宝开放平台  手机网页支付 整个流程 在支付宝签约如下产品 然后,使用支付宝最新的签名工具生成商户的私钥和公钥 值得注意的是,如果是.net c# 请选择PKCS1,我只采用1024密钥长度. ...

  5. 架构设计-支付宝、京东、美团、去哪儿的支付系统架构整体设计详解!!!

    架构设计-支付宝.京东.美团.去哪儿的支付系统架构整体设计详解!!! 支付产品模块是按照支付场景来为业务方提供支付服务.这个模块一般位于支付网关之后,支付渠道之前. 它根据支付能力将不同的支付渠道封装 ...

  6. 微信小程序php后台支付,微信小程序 支付功能实现PHP实例详解

    微信小程序 支付功能实现PHP实例详解 前端代码: wx.request({ url: 'https://www.yourhost.com/weixin/WeiActivity/payJoinfee' ...

  7. iOS开发支付篇——内购(IAP)详解

    iOS开发支付篇--内购(IAP)详解 苹果客户端购买虚拟商品是需要走内购 先看gif图 具体步骤: 协议.税务和银行业务 信息填写 内购商品的添加 添加沙盒测试账号 内购代码的具体实现 内购的注意事 ...

  8. 《HTML5网页开发实例详解》连载(四)HTML5中的FileSystem接口

    HTML 5除了提供用于获取文件信息的File对象外,还添加了FileSystem相关的应用接口.FileSystem对于不同的处理功能做了细致的分类,如用于文件读取和处理的FileReader和Fi ...

  9. GB28181平台对接接口详解

    28181平台对接接口详解 信令接口: 1.1 平台注册 下级平台主动向上级平台注册: 注册鉴权信息(用户名和密码)由上级提供: 举例说明: 下级--->上级 REGISTER sip:6201 ...

  10. 1400协议是什么和28181区别_28181平台对接接口详解

    文 档 名 称 文 档 密 级 2015-9-23 华为保密信息 , 未经授权禁止扩散 第 1 页 , 共 14 页 28181 平台对接接口详解 1 信令接口 1.1 平台注册  下级平台主动向上 ...

最新文章

  1. 和爸爸的聊天永远是个谜。。 | 今日最佳
  2. Java Servlet教程– ULTIMATE指南(PDF下载)
  3. Linux命令之su -- 用于切换当前用户身份到其他用户身份
  4. 使用JavaScript进行数组去重——一种高效的算法
  5. adams如何保存_教你如何快速把模型 从solidworks转到adams里
  6. 计算机会计系统审计的内容包括什么,会计电算化系统审计.docx
  7. python画50个图-Matplotlib如何绘制多个子图
  8. 三菱fx3uplc恢复出厂设置_三菱plc fx3u解密方法与步骤
  9. 计算空间点到直线的距离
  10. 解决微信浏览器不能自动播放视频
  11. 完全理解android事件分发机制
  12. ywq_app后台分析
  13. SAP入行须知 | SAP项目管理(PS模块)概述 |大连易拓SAP
  14. DirectX中的粒子系统
  15. 阿里智能对话交互技术实践与创新
  16. linux网卡聚合是什么意思,linux网卡聚合
  17. pyramid框架_Python Pyramid Web框架简介
  18. matlab 共振解调,Matlab.m 共振解调法诊断轴承损伤类故障的原理概述如下:当轴承某一元件表 联合开发网 - pudn.com...
  19. 星务计算机 英语怎么说,英语新闻词汇:“卫星发射中心”用英文怎么说
  20. pc 后台管理系统总结

热门文章

  1. unity 编辑器软件报错 相关
  2. 机器人建模中移动关节如何建立坐标系_解析:四轴机器人和六轴机器人有什么区别?---徕深科技...
  3. svn update 时报错 Node remains in conflict 和解决方法
  4. Redis(二)——复制
  5. Heuristic Search之Greedy Best First Search
  6. RestAssured接口测试框架
  7. 易语言注册机接码平台对接
  8. win7中显示桌面的方式有哪些?
  9. USB VID和PID
  10. 弱一致性、CAP、BASE与NoSQL