当前电商项目中,通过接入支付宝提供了订单在线支付功能,并且后续针对用户下单后的支付流程做了定制化的设计。采用了一套基于RocketMQ事务消息实现的订单确认机制,来完成订单超时回退功能。
这一节课主要就是带大家理解电商项目中对于订单支付功能的设计。当然,重点是希望大家能够针对不同的支付场景,尝试进行不同的优化设计。
今天课程的关注点是以下几个问题:
- 了解支付宝支付能力接入方式。
- 项目中主要是通过支付宝的沙箱环境,快速接入支付宝进行订单支付。
- 电商项目如何对支付流程进行设计及优化。
支付宝接入流程简介
当今互联网时代,第三方支付已经成了人们不可或缺的一个生活工具,也成为了互联网公司必不可少的业务拼图。但是支付实际上是一个风险非常大的业务,真正能够自主开发第三方支付产品的企业非常少。国内目前有支付牌照的公司总共只有两百来家。因此大部分企业都需要接入第三方支付产品,通过他们形成自己的支付能力。
比较有名的第三方支付产品有支付宝、云闪付、和包支付、翼支付等。当前电商项目采用支付宝作为第三方支付产品。这一章节先来了解下如何接入支付宝。
1、支付宝接入哪些应用场景
支付宝提供了两个重要的服务开放平台,对外开放自己的核心支付能力。第三方企业都可以通过这两个服务开放平台接入支付宝,借助支付宝开发自己的支付场景。
一个是面向商家的支付宝商家中心(https://b.alip ay.com/page/portal/home),另一个是面向开发者的支付宝开放平台(https://open.alipay.com/)。。)
当然我们这次更关心的是在技术层面如何快速接入支付宝,所以更关心后面的支付宝开放平台,后面简称支付宝平台。首先可以进入支付宝平台,快速了解一下支付宝有哪些接入方式。
可以看到,当前支付宝的接入场景是非常丰富的。当前电商项目会采用当面付支付场景进行接入。
官网上对于当面付有非常多详细的文档(文档地址:https://opendocs.alipay.com/open/194/105072?ref=api),并且还提供了非常丰富的示例。,并且还提供了非常丰富的示例。)
当面付有两种典型的场景,一种是用户出示付款码,商家扫描二维码付款。另一种是购买商品后,商家出示二维码,用户使用支付宝扫描二维码完成付款。
这两种支付场景相信你一定不陌生,或多或少的都应该通过这种模式购买过产品。
电商采用的是第二种扫码支付的场景,即用户下单后,会在网站上给用户展示一个二维码,然后用户扫码完成支付。
有兴趣你可以仔细阅读理解下官方的文档,理解一下在你日常购买过程中,整个数据是如何流转的。
2、了解支付宝沙箱环境与正式环境
如果你仔细看下这个文档,一定会注意到一个章节是计费模式。是的,第三方应用采用这种方式,每一笔交易都是需要付费给支付宝的。这样对于开发很不方便。
在支付宝开放平台上,给开发者提供了一个测试用的沙箱环境。https://openhome.alipay.com/develop/sandbox/app
沙箱环境提供了一系列开发调试所需要的帐号与应用信息,这些测试帐号会定期改变。
这里最重要的是PID和APPID两个参数。沙箱环境直接给出了对应的尝试数据,正式环境都需要向支付宝进行申请才能获取。
其中,PID表示商家账户ID,在正式环境中,需要由商户登录支付宝商家中心后获取。
而APPID表示在支付宝上注册的第三方应用的ID。需要由开发者创建应用获取。开发者登录支付宝开放平台后,进入控制台创建对应的应用。
创建应用后还不算完,需要商户绑定应用,这样的PID和APPID才可以一起使用。商户登录商家平台后,在账户中心选择APPID绑定,绑定开发者创建的应用。
这里省略掉了正式环境各种提交资料,审批的复杂过程。
另外,沙箱环境还提供了一个沙箱版本的支付宝APP,这个在后面电商项目中也是需要用到的,需要大家下载沙箱版支付宝APP并安装到手机当中。
下载页面: https://open.alipay.com/develop/sandbox/tool 在页面下方,有个产品列表部分,可以看到,沙箱环境中的商户已经完成了很多重要产品的签约,在正式环境,都是需要单独进行签约的。
支付宝的正式环境和沙箱环境的接口并不完全一样。真实应用在沙箱环境调试成功后,并不能保证在正式环境就一定没有问题,还需要迁移到正式环境重新测试验收。
3、当面付应用测试接入支付宝
在支付宝开放平台上,针对各种应用场景提供了非常丰富的SDK工具包以及配套的Demo。这里我们直接提供一个包含了支付宝当面支付和电脑网站支付的Demo案例,节省大家找文档的时间。
见测试项目 AlipayDemo。当面付模块只需要启动Main.java即可运行。但是在运行之前,需要调整一些配置信息。这些配置信息都在zfbinfo.properties文件中。
电脑网站支付的配置信息在com.example.demo.config.AlipayConfig中。app_id 和 pid属性可以在沙箱应用页面直接获取。
open_api_domain这个属性是请求网关地址URL,默认是正式环境的网关地址。沙箱环境的网关地址是: https://openapi.alipaydev.com/gateway.do 。
mcloud_api_domain是一个用于统计的网关。alipay_public_key是支付宝公钥属性,需要在沙箱应用页面查看。
private_key和public_key是应用自己设置的私钥。其中,这个密钥需要生成一对公私钥,将应用的公钥上传到支付宝上,而私钥自己保存。
支付宝采用的是RSA非对称加密的方式来保证业务请求的安全性,RSA加密方式需要两个成对生成的公私钥,来对报文分别进行加密和解密,其中私钥自己保存,而公钥则分发给对应业务方。通常用于一次请求的加解密过程。
而支付宝开放平台采用的是双向非对称加密的安全机制。应用注册时,支付宝会生成一组支付宝公私钥,公钥分发给应用,私钥支付宝自己保存。
应用往支付宝发起请求时,需要自己获取公钥,用来对发往支付宝的请求报文进行加密。支付宝会尝试使用对应的私钥进行解密,如果解密不成功则会报验签错误的异常,不允许访问服务。
支付宝在往应用推送业务报文时,同样需要应用自己生成一组应用公私钥,应用自己保存私钥,公钥则上传到支付宝中。支付宝在推送业务报文时,会使用公钥进行加密。应用只有使用对应的私钥解密才能获取到业务数据。这样才能保证业务报文的安全性。
生成密钥时,可以下载支付宝提供的密钥生成工具进行生成。工具下载参见网页: https://opendocs.alip ay.com/common/02kipl 配置修改完成后,需要在MAIN.java中做一下小修改,在它的435行,需要配置一下二维码图片的生成地址,并且把生成二维码的那一行代码解除注释。
// 需要修改为运行机器上的路径String filePath = String.format("D:/alipay/qr-%s.png", response.getOutTradeNo()); log.info("filePath:" + filePath); ZxingUtils.getQRCodeImge(response.getQrCode(), 256, filePath); break;保存二维码的目录要提前手动创建。然后执行MAIN.java。如果参数没有问题,会提示支付宝预下单成功的日志信息。
19:26:18.367 [main] INFO com.example.f2f.Main - 支付宝预下单成功: ) 19:26:18.367 [main] INFO com.example.f2f.Main - code:10000, msg:Success 19:26:18.367 [main] INFO com.example.f2f.Main - body: {"alipay_trade_precreate_response": {"code":"10000","msg":"Success","out_trade_no":"tradeprecreate16632411762145609885", "qr_code":"https:\/\/qr.alipay.com\/bax046621l7l0boqqkcf001d"},"sign":"eELa9G0YxKEjM sXiSDSMbFEvBfJuhOwBjTZ239ZdiKfVYkdjmZjCy59iNlBS/b0N+13y1XL3K9yd1En48VFSYk3PJ5aJBoJLh eeEB9vAqW1a26L2Gx6AuIeK8A8y2//B4jGUSobjq2X5m1WbbJL2zgLDjnaS9bvWW3mzEXg2A2OL/fo+L0l8p M8lGrVifxiPTQ1hPu1i+eYrIz3/nIVjQWlWIGalNKAjA9Nckt9vKbk8Cd1pWpNtj63Y1alp3b08KG7qph1ri sUQcu0bdZ0FZryLpAHK6sazIlZZtWSG10p0yR7yoZQGjuNtMZEj5Uv0/tTORN9/ylNtnR2tAKqghQ=="} 19:26:18.367 [main] INFO com.example.f2f.Main - filePath:D:/alipay/qr- tradeprecreate16632411762145609885.png然后在配置的目录中可以看到生成的二维码图片。
在做实际应用集成时,这个二维码图片就可以展示到应用的前端页面上,然后给客户扫描支付。
需要注意的是,这个二维码图片是对接支付宝沙箱环境生成的,扫描时也必须用沙箱环境的支付宝APP扫码支付。
在示例中还有其他的一些业务操作,比如查询、退货等,可以自行体验。测试的结果可以到沙箱环境查看买家和卖家的余额变化,确认交易是否正常完成。