alipay.trade.query,是支付宝交易的查询接口 .. 你可以带着自己的电商系统的订单号,或者支付宝的交易订单号,去请求这个查询接口 .. 它会给我们返回订单的交易状态 ..
下面, 我们可以用一个简单的方法去试一下这个查询接口 .. 在 render 方法里面,添加一个 trade_no .. 这表示的是支付宝的交易订单号 .. 它的值用一下 request.input .. 得到请求里的 trade_no 这个数据 .. 支付完成以后,重定向到结账页面的时候,地址里面会包含这个 trade_no ..
if ... 如果有 trade_no .. 我们就把它放在用户的 session 里面存一下 .. trade_no .. 对应的值就是 trade_no .. 这样在请求查询接口的时候,可以从用户的 session 里,找到 trade_no 的值,然后去请求交易查询接口 .. 这里再把需要用的 session 从方法的参数对象里拿出来用一下 ..
查询的动作可以放在 query 这个方法里面 . 需要用到 session ..
里面先要去准备一些公共参数 .. 添加一个 commonParams .. 用一下 this.aliPayCommonParams .. 接口的名字是 alipay.trade.query
再准备一下请求参数 .. 添加一个 trade_no .. 它的值我放在用户的 session 里了 .. session get .. 得到 trade_no
然后添加一个 biz_content .. 用一下 JSON.stringify .. 一个对象 .. 把 trade_no 放进来 .. 我们也可以使用 out_trade_no 的值去请求查询 ..
下面再去创建一个签名 .. 先准备一下要参与签名的数据 .. 添加一个 requestParams .. 把 commonParams 里的东西放进来 .. 再加上 biz_content ..
然后添加一个 sign .. 签名可以使用 this.aliPaySign .. 参与签名的数据是 requestParams ..
有了请求要带的数据,就可以再去组织好请求的地址了 .. requestUrl .. 用一下 this.aliPayRequestUrl .. requestParams .. 还有 sign 交给这个方法 ..
这样就可以去请求这个查询接口了 ..
下面可以再添加一个 _response .. 表示请求查询响应回来的数据 .. await .. 等待执行 axios.post 的结果 .. 请求地址是 requestUrl
你可以把 _response 里面的 data 属性的值输出到日志里检查一下 .. loggder debug .. 输出的是交易查询结果 .. _response.data
下面可以再添加一个 aliPayTradeQueryResponse .. 它的值是 _response.data.alipay_trade_query_response ..
请求的响应的数据里面会包含这个 alipay_trade_query_response,它里面包含了交易的状态还有一些相关的信息 .. 比如 code ,表示的就是请求查询的结果 .. 如果是 10000 就说明成功 ..
判断一下如果 aliPayTradeQueryResponse.code 等于 10000
再用一个 switch .. 检查一下 aliPayTradeQueryResponse 里的 trade_status .. 添加一种情况 .. 如果交易的状态是 TRADE_SUCCESS ... 就表示交易成功了 ..
这样我们可以让这个 query 方法响应一个 success ...
不然的话 .. 就让这个方法响应一个 failure ..
然后可以打开结账页面的自定义脚本 .. main.js ...
这里我们监听了支付成功按钮的点击事件 .. 点了它以后会用 ajax 请求 checkout/query 这个地址 .. 处理对这个地址请求用的方法就是刚才我们做的那个 query 方法 ..
在这个成功回调里,可以再判断一下,如果 response ,就是得到的响应等于 success .. 我们就可以把用户重定向到成功提示的页面上 .. window.location.href .. 等于 /checkout/completed ...
下面可以再试一下 ...
回到浏览器 .. 确认支付 ...
打开支付宝的支付页面 ... 扫描页面上的二维码 .. 或者登录到支付宝帐号可以完成支付 ...
完成以后,会被带回到这个结账页面 ... 按一下 支付成功 ... 会执行交易查询 .. 返回的结果如果是 success .. 就会把用户带到这个成功提示的页面上 ...