支付模块

功能介绍:

1.支付宝对接

2.支付回调

3.查询支付状态

 

学习目标:

1.熟悉支付宝对接核心文档,调通支付宝支付功能官方Demo

2.解析支付宝SDK对接源码

3.RSA1和RSA2验证签名及加解密

4.避免支付宝重复通知和数据校验

5.natapp外网穿透和tomcat remote debug

6.生成二维码,并持久化到图片服务器

7.支付宝回调,会放在request中,再从request中取出来,放在map中,再对map进行处理,打印的日志就是map中的内容

 

接口:

1./order/pay.do  支付订单

入参:orderNo,要支付的订单号

返回值:将持久化到ftp服务器上的二维码(通过nginx反向代理解析出来的url)和orderNo返回

2./order/query_order_pay_status.do  查询订单

入参:orderNo,要查询的订单号

用户付款后,收到支付宝确认成功的一个回调,就可以实时查到这个订单是否已经付款成功。

3./order/alipay_callback.do   支付宝回调

将回调地址/order/alipay_callback.do配置在项目中,以及支付宝官方配置,参数是ServerletRequest,从中拿到各种参数,并进行RSA2的签名

 

 

一些重要的官方文档:

1.沙箱登录

https://openhome.alipay.com/platform/appDaily.htm

2.沙箱环境使用说明和如何使用沙箱环境

https://support.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.KDBNpH&treeId=193&articleId=105311&docType=1#s0

3.当面付产品介绍、扫码支付接入指引、当面付快速接入、当面付接入必读、当面付进阶功能、当面付异步通知-仅用于扫码支付、当面付SDK&DEMO

https://support.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.rRQbV1&treeId=193&articleId=105072&docType=1

4.服务端SDK

 https://docs.open.alipay.com/54/103419

5.生成RSA密钥

 https://docs.open.alipay.com/291/105971

6.线上创建应用说明

 https://docs.open.alipay.com/200/105310

 

沙箱调试环境:

授权回调地址:线上url,这里我是申请了的nat,在我们发起请求时,要把这个url作为参数传给服务器。

AES密钥:在传输数据时,进行加密,支付宝通过AES密钥,对数据进行解密。

 

内部生成一个订单号,即选完商品后提交订单的那个操作;然后向支付宝请求预下单信息,里面包括外部订单号(out_trade_number,是针对支付宝来说的,但其实是我们的内部订单号)、验签、公钥等;然后,支付宝返回二维码信息(http协议的信息),拿到信息后可以利用工具生成二维码,以base64的方式传给前端,或以图片的形式持久化到ftp服务器,然后以http协议(nginx反向代理)的形式传给前端;支付宝钱包扫码后,会收到两次支付宝回调信息,第一次是支付宝返回的支付详情,第二次是在输入完密码后的账单详情。

支付宝扫码支付重要的字段:

关键入参:

参数名称 参数说明
out_trade_no 用户订单号,需要保证不重复
total_amount 订单金额
subject 订单标题
store_id 商户门店编号
timeout_express 交易超时时间

关键出参:

参数名称 参数说明
qr_code 订单二维码图片地址

其他重要字段:

参数名称 参数说明
trade_status 交易目前所处的状态
total_amount 本次交易支付的订单金额,单位为元
receipt_amount 商家在交易中实际收到的款项,单位为元
buyer_pay_amount 用户在交易中支付的金额,单位为元

交易状态说明:

枚举名称 枚举说明 触发条件描述 触发条件默认值
WAIT_BUYER_PAY 交易创建,等待卖家付款 交易创建 false(不触发)
TRADE_CLOSED 未付款交易超时关闭,或支付完成后全额退款 交易关闭 false(不触发)
TRADE_SUCCESS 交易支付成功 支付成功 true(触发)
TRADE_FINISHED 交易结束,不可退款 交易完成 false(不触发)

 

支付宝扫码支付重要细节:

1.主动轮询和回调的区别

2.避免单边账

3.同步请求的加签和验签

加签方法(如果不用SDK调用,推荐用该方法加签):

/*
    params     请求支付宝生成订单时的参数,参数列表,key是参数名称,value是参数值
    privateKey     加签私钥
    charset     加签字符集,统一用utf-8
*/
String AlipaySignature.rsaSign(Map<String, String> params, String privateKey, String charset);

验签方法(同步请求时,如果不用SDK调用,推荐用该方法验签):

/*
    content     待验签字符串
    sign     签名值
    publicKey     验签公钥
    charset     验签字符集,统一用utf-8
*/
boolean AlipaySignature.rsaCheckContent(String content, String sign, String publicKey, String charset);

4.回调的验证(签名、金额、订单号、订单状态、交易状态、商户id)

5.过滤掉重复的通知

6.一定要验证并确保可接受的异步通知是支付宝发出的

验签方法(例如异步通知的时候,用户需要用到验签方法):

/*
    params     支付宝的回调参数,参数列表(包括待验签参数和签名值sign),key是参数名称,value是参数值
    publicKey     验签公钥
    charset     验签字符集,统一用utf-8
   返回boolean类型,根据这个来判断是否接受这个异步通知
*/ boolean AlipaySignature.rsaCheckV2(Map<String, String> params, String publicKey, String charset);

7.回调请求的返回

商城给支付宝的返回数据。给支付宝返回时,应在response中把"success"放进去,返回的规则:

程序执行完后必须打印输出"success"(不包含引号),如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟,一般情况下,25小时内完成8次通知。(通知的间隔频率一般是:4m,10m,1h,2h,6h,15h)。

 

 

支付宝扫码支付对接技巧:

1.回调的调试方式

支付宝怎么调到我,因为支付宝是在网络中的,所以至少我应该是可以上外网的。所以有以下几种方案:

1)路由器设置开放本地到外网(不推荐)

2)外网远程debug:例如当前商城部署在阿里云上,阿里云对外是有一个固定的ip或域名,回调地址设置成阿里云的这个服务器,然后保证本地代码和阿里云上的代码是一致的,然后开放一个远程debug的端口,在本机进行远程debug。这样在支付宝送回请求时,可以在本地进行debug。注意:(1)保持远端代码版本和本地代码保持一致。(2)及时关闭开放的debug端口。

3)内网穿透(natapp)

通过这个natapp软件,可以得到一个外网可以访问的域名,访问这个域名与访问本机是一样的。

posted on 2018-03-08 15:38  二十年后20  阅读(441)  评论(0编辑  收藏  举报

导航