对接支付宝流程【网页支付,手机网页支付,APP支付】
支付的大体流程
配置应用、
APPID
注册完成以后添加应用就可以获得,没有可以使用沙箱模式中提供的测试应用
然后根据需求签约功能,开启使用,功能【添加能力】
支付宝网关(固定)
应用网关(可选)
回调地址
支付回调地址
,支付以后,支付宝会将支付结
果进行请求
传达到我们定义的回调地址
之上,这个地址必须是线上我们开发好的一个接口,用以接收支付结果;
商家私钥&支付宝公钥
支付宝采用RSA非对称性加密以保证数据的安全,这里我们可以使用支付宝提供的密钥生成工具进行生成
步骤如下:
如此便得到了应用公钥
以及应用私钥
上面提到的商家私钥
就是应用私钥
这个参数了,两种称呼而已
支付宝公钥
需要使用商家公钥(应用公钥)
进行换取,
商家公钥换取流程:
网页与移动应用–>应用信息–>查看应用公钥–>验证信息
然后在此用我们刚才申请的应用公钥
替换其中的内容,点击确认,此时会出现按钮查看支付宝公钥
点击即可查看
业务对接
这里我们使用电脑pc网页支付以及app支付为例
pc网页支付
Controller部分
/*** 电脑网页支付* @throws IOException* @throws AlipayApiException*/
@GetMapping("/pcPagePay")
public void pcPagePay() throws IOException, AlipayApiException {String oderId = UUID.randomUUID().toString();// 修改为以页面形式进行响应response.setContentType("text/html;charset=utf-8");// 获取响应目标PrintWriter writer = response.getWriter();// 将生成的支付页面展示给前端页面writer.write(pcPagePay.creatOder(oderId).getBody());// 执行关流flushAndClose(writer);
}
Service部分
/*** 获取支付页面*/
public AlipayTradePagePayResponse creatOder(String oderId) throws AlipayApiException {// 填写基本信息AlipayClient alipayClient = new DefaultAlipayClient(payGetWay, // 支付宝网关,注意。沙箱环境的网关和正式环境有所不同,错误的当导致单号无效或者404appId, // appid就是我们注册应用的appidappPrivateKey, // app私钥"json", //charSet, // 字符集alipayPublicKey, // 阿里支付公钥"RSA2" // 加密方式);// 创建支付宝交易页面支付请求对象AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();// 填入回调地址,支付成功以后支付结果将会响应到这里request.setNotifyUrl(notifyUrl);// 支付成功以后跳转的页面,页面跳转时同时也会携带支付结果参数,可填可不填request.setReturnUrl("https://www.baidu.com");// 创建请求体JSONObject bizContent = new JSONObject();// 填入商家方的唯一单号,稍后将用以保证订单不重复支付bizContent.put("out_trade_no", oderId);// 订单价格,精确到两位bizContent.put("total_amount", 0.01);// 商品标题bizContent.put("subject", "测试商品");// 产品代码bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");//bizContent.put("time_expire", "2022-08-01 22:00:00"); 商品明细信息,按需传入//JSONArray goodsDetail = new JSONArray();//JSONObject goods1 = new JSONObject();//goods1.put("goods_id", "goodsNo1");//goods1.put("goods_name", "子商品1");//goods1.put("quantity", 1);//goods1.put("price", 0.01);//goodsDetail.add(goods1);//bizContent.put("goods_detail", goodsDetail); 扩展信息,按需传入//JSONObject extendParams = new JSONObject();//extendParams.put("sys_service_provider_id", "2088511833207846");//bizContent.put("extend_params", extendParams);// 最后将信息写入请求对象request.setBizContent(bizContent.toString());// 执行请求创建支付页面AlipayTradePagePayResponse response = alipayClient.pageExecute(request);if (response.isSuccess()) {System.out.println("调用成功");// 调用成功则获得支付页面,其中的body即为页面信息,可以在这里get或者在用的时候再get。万万不可URL转码return response;} else {System.out.println("调用失败");throw new RuntimeException("支付调用失败");}
}
此时访问接口即可获取支付页面
APP支付
App支付的基本流程和网页支付差不多,区别就是不用响应页面到前端,我们将获取到的响应信息直接给前端进行响应,前端根据响应体中的包地址拉起支付宝。并附上参数,则可拉取支付信息
代码:
Controller部分
/*** app支付* @throws IOException* @throws AlipayApiException*/
@GetMapping("/appPay")
public AlipayTradeAppPayResponse appPay() throws IOException, AlipayApiException {return appPay.creatOder(UUID.randomUUID().toString());
}
Service部分
public AlipayTradeAppPayResponse creatOder(String oderId) throws AlipayApiException {AlipayClient alipayClient = new DefaultAlipayClient(payGetWay,appId,appPrivateKey,"json",charSet,alipayPublicKey,"RSA2");AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();request.setNotifyUrl(notifyUrl);JSONObject bizContent = new JSONObject();bizContent.put("out_trade_no", oderId);bizContent.put("total_amount", 0.01);bizContent.put("subject", "测试商品");bizContent.put("product_code", "QUICK_MSECURITY_PAY");//bizContent.put("time_expire", "2022-08-01 22:00:00"); 商品明细信息,按需传入//JSONArray goodsDetail = new JSONArray();//JSONObject goods1 = new JSONObject();//goods1.put("goods_id", "goodsNo1");//goods1.put("goods_name", "子商品1");//goods1.put("quantity", 1);//goods1.put("price", 0.01);//goodsDetail.add(goods1);//bizContent.put("goods_detail", goodsDetail); 扩展信息,按需传入//JSONObject extendParams = new JSONObject();//extendParams.put("sys_service_provider_id", "2088511833207846");//bizContent.put("extend_params", extendParams);request.setBizContent(bizContent.toString());AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);if(response.isSuccess()){System.out.println("调用成功");return response;} else {System.out.println("调用失败");throw new RuntimeException();}
}
参数都一样,就不做注释了,这里会获得一个AlipayTradeAppPayResponse
将对象响应到前端即可完成后端流程;
前端可根据信息拉起支付宝进行支付
支付结果的回调通知
在用户完成支付以后,支付宝会对我们填写的回调地址进行通知请求,我们需要创建我们在回调中填写的接口进行接收参数
接口类型:POST
传参类型:FORMDATA
这里需要对请求进行验签,以保证支付结果的真实性;
验签代码
@PostMapping("/notifyUr")public void notifyUr() throws AlipayApiException {// 创建结果集MAPMap<String, String> params = new HashMap<>();// 获取form表单参数Map requestParams = request.getParameterMap();log.info("回调触发了,请求体:{}", requestParams);// 遍历Map从新组合写入新Mapfor (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {String name = (String) iter.next();String[] values = (String[]) requestParams.get(name);String valueStr = "";// 不是最后一个就在结尾加个,号for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";}//乱码解决,这段代码在出现乱码时使用。//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);}//切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)boolean flag = AlipaySignature.rsaCheckV1(params, // 取出的参数alipayPublicKey, // 阿里支付公钥charSet, // 字符集"RSA2" // 加密方式 );if (!flag)throw new RuntimeException("验签未通过");log.info("验签通过");// 此时验签通过,params参数里包含了订单的所有参数,可以进行入库,}
支付完成时接口会被支付宝请求,
我们对其验签以后就可以执行自己的操作了
,
App支付包含一个同步通知,建议还是采用异步通知,同步通知仅作为支付结束的标志;
什么?你问我为啥?支付宝这么说的~
支付宝开放平台网站
对接支付宝流程【网页支付,手机网页支付,APP支付】相关推荐
- 对接支付宝服务商当面付手机网页支付
一.前期准备: SpringBoot对接支付宝当面付和手机网站支付_springboot 支付宝当面付_Biubiubiuexo的博客-CSDN博客 配置成功后获得到我们开发需要的:支付宝公钥.商户私 ...
- 根据两个经纬度点调用百度地图应用查询路线 适用android或者ios中及网页浏览(手机网页同样适用)
Intent intent = null;try {// 如果有安装百度地图 就启动百度地图StringBuffer sbs = new StringBuffer();sbs.append(" ...
- java app微信支付接口_JAVA微信APP支付接口整合
上次我们看到了支付宝的APP支付工具,那么这次就来封装封装微信的APP支付;如果已经清楚了支付宝的支付流程,那么微信支付也和它大同小异了,当然这其中肯定是有各种变化的: 首先让我把微信支付文档的官网贴 ...
- SpringBoot对接支付宝当面付和手机网站支付
一.前期准备: 1.注册商家账号:支付宝 2.登录进入,在产品中心选择自己所需要对接的功能: 3.进入对接功能,选择立即开通 4.填写商户信息: 5.开通成功之后,产品中心>>开发设置&g ...
- 银联支付-手机网页支付接口开发
这2天因为项目需要,银联支付的手机网页支付,已经把测试ok了, 所以这里做个记录. 1,到银联的官网下载demo,注意官网是按照平台区别的(pc端.手机网页.手机控件),下载手机网页版本的demo.d ...
- 支付宝支付-当面付和App支付
公司最近在做个视频桩的项目,需要在桩上用到支付宝支付功能. 去年项目当中有应用过支付宝,当时前端是用react,后台返回qcode到前端后,前端通过react的插件(其实就是支付宝的sdk),拼接qc ...
- java app支付_java实现微信App支付
废话不多说,直接上代码,微信的小程序,公众号支付都大差不差,自行看文档修改参数即可. maven依赖: com.github.wxpay wxpay-sdk 0.0.3 application.yml ...
- 微信app支付 php,PHP 微信APP支付 整合 thinkphp3.2.3
php开发APP支付功能中,涉及到微信APP支付功能.为了考虑数据的严密性,加密的过程全部都需要在服务端进行生成.微信APP支付与支付宝的还不太一样.微信APP支付需要二次的加密请求才可以完成整个服务 ...
- 微信支付服务商java_微信APP支付服务商和子商户的流程模式
一.子商户APP中提交支付 以下是子商户APP中调用支付的交互时序图,如下图所示.服务商提供的接口实现请参见下文第2节. 商户APP调用支付的主要交互说明: 1.用户在商户APP中选择商品,选择微信支 ...
- 【手机网页】手机网页显示图片模糊问题
[本文原创,谢绝转载] [总结] 1.手机浏览器,不管是UC.原生浏览器.safari,显示页面都是按照320px的 2.由于现在手机的宽度都大于320px,所以,图片会模糊 3.像苹果的retina ...
最新文章
- Java NIO Selector 详解
- BZOJ1112[POI2008]砖块Klo——非旋转treap
- [C#1] 10-事件
- pdfbox 第一页加内容_你用代码做过哪些很酷/有趣的事?
- python操作dom_Python Dom 的介绍和使用day1
- 基本的JVM内存分配过程案例
- CIKM 2021 | AMTL:设计孪生掩码层高效学习维度自适应的Embedding
- 华为服务器如何登录修改密码,如何修改云服务器的登录密码
- Leetcode--94. 二叉树的中序遍历(迭代递归)
- OC基础15:内存管理和自动引用计数
- GaussDB Hash表分布列选择原则及数据倾斜检测
- 24_MySQL高可用之MMM
- 电子电路设计中的脉冲电路详解
- MVP模式基本用例开发
- ModSecurity web application firewall (WAF) Research - .Little Hann
- 一个创业者的自白:假如重回华为怎么做?
- 从OPPO Finder看手机产品的差异化体现
- 发那科2021参数_发那科参数
- 计算机考试excel统计图怎么做,excel表格取数据做统计图-Excel如何制作统计数据...
- CSS3——制作带动画效果的小图片
热门文章
- 实践:加快gradle的构建速度
- 河南民办计算机大学排名,2021河南民办大学排名 河南最好的民办本科高校有哪些...
- [NIPS 2018] Stacked Semantics-Guided Attention Model for Fine-Grained Zero-Shot Learning
- iptables drop与reject 的区别
- python分析 【都挺好】小说任务关系
- 笔记本电脑触摸板手势操作
- Python使用Regular入门
- ERA5 total precipitation的单位
- 软件测试技术---单元测试和集成测试
- 从巴菲特身上学习到的投资哲学