创建支付链接的时候可以设置一个异步通知地址 .. 打开这个 alipay request 类文件 .. 在这个 WC_Gateway_ALipay_Request 的 get_return_url 这个方法里面 ..
再添加一个 $notify_url .. 它的值用一下 WordPress 提供的 rest_url 这个函数 .. 获取到 alipay/v1/notify 这个 REST 接口的地址 ..
下面再用一下 this .. request .. setNotifyUrl 方法设置一下异步通知地址 .. 地址就是上面的这个 $notify_url ..
收到支付宝的异步通知以后 .. 可以用一下通知里带的数据 .. 在这个 REST 接口处理方法里面 .. 添加一个 $body .. 用一下 $request 上的 get_body_params 方法,它可以给我们返回处理好的请求里面带的数据 ..
这个通知里的数据会有一个 out_trade_no ... 注意如果启用了插件的 sandbox 功能,交易号里面会带着 sandbox 前缀 .. 可以把它从交易号里去掉 .. 用一下 php 的 str_replace .. 查找的字符是 (sandbox) - .. 把它替换它空白 .. 要替换的字符是 $body 里面的 out_trade_no ..
下面再添加一个 $total_amount .. 它的值是 $body 里的 total_amount .. 还需要一个 trade_status .. 它的值是 $body 里的 trade_status .. 这个 trade_status 表示的是交易的状态 .. 再添加一个 $trade_no .. 它的值是支付宝交易号,这个交易号的值就是 body 里的 trade_no
因为这个交易号就是我们的订单号,可以根据它的值得到订单相关的信息 .. 添加一个 $order .. 用一下 wc_get_order .. 把订单号告诉这个函数 .. 这个就是 $out_trade_no ..
下面可以判断一下,如果没有这个 $order,也就是在我们的系统里没找到这个订单 .. 让这个函数 return 一个 failure ..
有了订单就可以根据这个订单得到它的支付方法 .. 添加一个 $gateway .. 用一下 wc_get_payment_by_order .. 把订单告诉给这个函数 ..
下面再做点判断 .. 检查一下订单里的总计金额 .. 如果不等于支付宝通知里带的 total_amount 的值 .. 并且 .. 插件没有启用 sandbox .. 也让这个函数 return 一个 failure ..
下面要做的是验证一下数据签名 .. 添加一个 sign_verified .. 用一下之前我们定义的 woocommerce_alipay_verify_sign 这个函数 .. 验证的数据是 $body .. 再把 $gateway 交给它 ..
如果 .. 验证通过了 ..
先输出一条日志 .. $gateway .. log .. 输出 接收到支付宝异步通知 ..
下面再判断一下 .. 看看 $trade_status 就是交易的状态,是不是等于 TRADE_SUCCESS .. 如果是这个状态就表示用户已经成功支付了 .. 并且 .. $order .. get_status .. 订单的状态应该等于 on-hold ..
这样我们就可以更新一下订单的状态 ... 用一下 $order 上的 update_status .. 把状态更新成 processing .. 带着一条备注信息 . 支付宝交易号 .. 后面加上 $trade_no ..
可以再执行一下 $order 上的 reduce_order_stock .. 更新一下库存 ..
然后再用 update_post_meta 给订单添加一个自定义字段 .. 内容的 id 是 $order .. get_id .. 字段的名字是 trade_no .. 对应的值是上面定义的 $trade_no ..
在这个函数里,声明一下要使用的 global .. $woocommerce ..
这里再用一下 $woocommerce .. cart 上的 empty_cart() 清空购物车 ..
再让方法回应一个 succes .. 不然的话 .. 回应一个 failure .. 再去掉最后的这个 return 'success' ..
我们也可以把这条日志放在验证签名的上面 ..