支付的大体流程

配置应用、

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支付】相关推荐

  1. 对接支付宝服务商当面付手机网页支付

    一.前期准备: SpringBoot对接支付宝当面付和手机网站支付_springboot 支付宝当面付_Biubiubiuexo的博客-CSDN博客 配置成功后获得到我们开发需要的:支付宝公钥.商户私 ...

  2. 根据两个经纬度点调用百度地图应用查询路线 适用android或者ios中及网页浏览(手机网页同样适用)

    Intent intent = null;try {// 如果有安装百度地图 就启动百度地图StringBuffer sbs = new StringBuffer();sbs.append(" ...

  3. java app微信支付接口_JAVA微信APP支付接口整合

    上次我们看到了支付宝的APP支付工具,那么这次就来封装封装微信的APP支付;如果已经清楚了支付宝的支付流程,那么微信支付也和它大同小异了,当然这其中肯定是有各种变化的: 首先让我把微信支付文档的官网贴 ...

  4. SpringBoot对接支付宝当面付和手机网站支付

    一.前期准备: 1.注册商家账号:支付宝 2.登录进入,在产品中心选择自己所需要对接的功能: 3.进入对接功能,选择立即开通 4.填写商户信息: 5.开通成功之后,产品中心>>开发设置&g ...

  5. 银联支付-手机网页支付接口开发

    这2天因为项目需要,银联支付的手机网页支付,已经把测试ok了, 所以这里做个记录. 1,到银联的官网下载demo,注意官网是按照平台区别的(pc端.手机网页.手机控件),下载手机网页版本的demo.d ...

  6. 支付宝支付-当面付和App支付

    公司最近在做个视频桩的项目,需要在桩上用到支付宝支付功能. 去年项目当中有应用过支付宝,当时前端是用react,后台返回qcode到前端后,前端通过react的插件(其实就是支付宝的sdk),拼接qc ...

  7. java app支付_java实现微信App支付

    废话不多说,直接上代码,微信的小程序,公众号支付都大差不差,自行看文档修改参数即可. maven依赖: com.github.wxpay wxpay-sdk 0.0.3 application.yml ...

  8. 微信app支付 php,PHP 微信APP支付 整合 thinkphp3.2.3

    php开发APP支付功能中,涉及到微信APP支付功能.为了考虑数据的严密性,加密的过程全部都需要在服务端进行生成.微信APP支付与支付宝的还不太一样.微信APP支付需要二次的加密请求才可以完成整个服务 ...

  9. 微信支付服务商java_微信APP支付服务商和子商户的流程模式

    一.子商户APP中提交支付 以下是子商户APP中调用支付的交互时序图,如下图所示.服务商提供的接口实现请参见下文第2节. 商户APP调用支付的主要交互说明: 1.用户在商户APP中选择商品,选择微信支 ...

  10. 【手机网页】手机网页显示图片模糊问题

    [本文原创,谢绝转载] [总结] 1.手机浏览器,不管是UC.原生浏览器.safari,显示页面都是按照320px的 2.由于现在手机的宽度都大于320px,所以,图片会模糊 3.像苹果的retina ...

最新文章

  1. Java NIO Selector 详解
  2. BZOJ1112[POI2008]砖块Klo——非旋转treap
  3. [C#1] 10-事件
  4. pdfbox 第一页加内容_你用代码做过哪些很酷/有趣的事?
  5. python操作dom_Python Dom 的介绍和使用day1
  6. 基本的JVM内存分配过程案例
  7. CIKM 2021 | AMTL:设计孪生掩码层高效学习维度自适应的Embedding
  8. 华为服务器如何登录修改密码,如何修改云服务器的登录密码
  9. Leetcode--94. 二叉树的中序遍历(迭代递归)
  10. OC基础15:内存管理和自动引用计数
  11. GaussDB Hash表分布列选择原则及数据倾斜检测
  12. 24_MySQL高可用之MMM
  13. 电子电路设计中的脉冲电路详解
  14. MVP模式基本用例开发
  15. ModSecurity web application firewall (WAF) Research - .Little Hann
  16. 一个创业者的自白:假如重回华为怎么做?
  17. 从OPPO Finder看手机产品的差异化体现
  18. 发那科2021参数_发那科参数
  19. 计算机考试excel统计图怎么做,excel表格取数据做统计图-Excel如何制作统计数据...
  20. CSS3——制作带动画效果的小图片

热门文章

  1. 实践:加快gradle的构建速度
  2. 河南民办计算机大学排名,2021河南民办大学排名 河南最好的民办本科高校有哪些...
  3. [NIPS 2018] Stacked Semantics-Guided Attention Model for Fine-Grained Zero-Shot Learning
  4. iptables drop与reject 的区别
  5. python分析 【都挺好】小说任务关系
  6. 笔记本电脑触摸板手势操作
  7. Python使用Regular入门
  8. ERA5 total precipitation的单位
  9. 软件测试技术---单元测试和集成测试
  10. 从巴菲特身上学习到的投资哲学