微信支付服务器异步通知丢失,支付宝支付微信支付开发处理异步通知 notify 的方法...

在本站之前的文章中,我为大家介绍了在 WordPress 中使用支付宝支付和微信支付的开发方法,那两篇文章中,只介绍了处理同步返回数据的方法,而没有介绍怎么处理支付平台异步通知返回数据的方法,只有同步而没有异步通知的处理显然是不完整的,如果用户支付完成之后,没有等待支付网站跳转回发起支付的网站就关闭了页面,发起支付的网站是收不到支付结果通知的。今天我就为大家介绍一下怎么在支付发起网站增加处理异步通知的方法。

异步通知和同步通知的相同和不同

两种通知方式的相同之处就是返回的数据完全相同,不同之处主要有以下两点。

同步通知返回数据的方法为 GET 请求,我们可以很方法的通过 $_GET 全局变量获取返回的数据并进行处理。而异步通知的请求方法为 POST 方法。

同步通知返回的数据,我们可以很轻松的打印出来,出现错误方便排查原因,而同步通知返回的数据没有办法直接打印,只能通过写入 Log 或数据库的方式来查看返回的数据。

有了以上两点不同,处理异步通知的方法肯定就和处理同步通知的方法不一样了,其实主要的不同在于返回数据的方法,一个是 GET 请求,一个是 POST 请求。下面我们来看一下具体的处理代码。

处理异步通知的注意事项

不管是通知通知,还是异步通知,在发起支付的网站,处理通知的业务逻辑其实是一样的,基于 DRY 原则,我们完全可以把两种处理方式放在一起处理,在两种支付方法不同的地方做出判断,各自处理就可以了。下面是支付宝支付和微信支付获取请求数据的方法,如果通知方法是同步通知,直接通过 $_GET 变量获取订单号,如果是异步通知,支付宝可以直接通过 $_POST 变量获取数据,而微信支付返回的数据是 XML 格式的,我们需要通过辅助函数转换为数据,然后获取数据。

/**

* 获取支付网关返回的 out_trade_no

*/

if ( $notify == 'return' ) {

$out_trade_no = $_GET[ 'out_trade_no' ];

} else {

if ( $method == 'alipay' ) {

$out_trade_no = $_POST[ 'out_trade_no' ];

} else {

$out_trade_no = Helper::xml2array( file_get_contents( 'php://input' ) )[ 'out_trade_no' ];

}

}

验证同步通知成功,我们需要返回一个成功消息 “success” 给支付网关,以免支付网关重复发送通知。

if ( $response->isPaid() ) {

if ( $notify == 'notify' ) {

echo 'success';

}

}

有了异步通知的方法,支付接口的开发才算是完整的,就是用户支付完成后关闭了支付网关页面,发起支付的网站也能很快判断用户的支付状态,并根据用户的支付状态做出自动处理订单、自动发货等后续的业务处理。

支付宝微信支付开发的重点

其实在支付宝微信支付开放的过程中,支付接口的对接并不是最重要的部分,接口的注意事项是固定的,总共就有那么多,不会有太多变化。而处理订单的业务逻辑却是千变万化的,而因为支付直接设计到交易,在业务逻辑的处理过程中,我们一定要小心慎重,尽量完整地考虑各种情况的发生及处理方法,这样才能做到万无一失。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用 `com.github.wechatpay-apiv3` 库处理微信 H5 支付的异步通知,您可以按照以下步骤进行操作: 1. 在项目的 Maven 配置文件(例如 `pom.xml`)中添加 `com.github.wechatpay-apiv3` 的依赖项: ```xml <dependencies> <dependency> <groupId>com.github.wechatpay-apiv3</groupId> <artifactId>wechatpay-apache-httpclient</artifactId> <version>1.0.0-beta4</version> </dependency> </dependencies> ``` 2. 在异步通知的接口中编写代码。 ```java import com.github.wechatpay.apiv3.WxPayApiV3; import com.github.wechatpay.apiv3.WxPayApiV3Config; import com.github.wechatpay.apiv3.model.notify.WxPayOrderNotifyResult; import com.github.wechatpay.apiv3.model.notify.WxPayOrderNotifyResult.NotifyResponse; import com.github.wechatpay.apiv3.model.notify.WxPayOrderNotifyResult.Resource; import org.apache.hc.core5.http.io.entity.EntityUtils; import org.apache.hc.core5.http.nio.entity.BasicAsyncEntityConsumer; import org.apache.hc.core5.ssl.SSLContextBuilder; import org.apache.hc.core5.util.Timeout; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.security.KeyStore; public class WeChatH5NotifyHandler { private static final String WECHAT_API_CERT_SERIAL_NUMBER = "YOUR_WECHAT_API_CERT_SERIAL_NUMBER"; private static final String WECHAT_API_CERTIFICATE_PATH = "path/to/your/wechat/api/certificate.p12"; private static final String WECHAT_API_CERTIFICATE_PASSWORD = "your_certificate_password"; public void handleNotify(HttpServletRequest request, HttpServletResponse response) throws IOException { try { // 创建微信支付 API 配置 WxPayApiV3Config config = new WxPayApiV3Config.Builder() .appId("your_app_id") .merchantId("your_merchant_id") .privateKeySerialNumber(WECHAT_API_CERT_SERIAL_NUMBER) .privateKey(getPrivateKey()) .build(); // 创建微信支付 API 实例 WxPayApiV3 wxPayApiV3 = new WxPayApiV3(config); // 读取异步通知的请求体 String notifyData = EntityUtils.toString(new BasicAsyncEntityConsumer(), request.getInputStream(), StandardCharsets.UTF_8); // 解析异步通知数据 WxPayOrderNotifyResult notifyResult = wxPayApiV3.parseOrderNotifyResult(notifyData); // 验证签名 if (wxPayApiV3.verifySignature(notifyResult)) { // 签名验证成功 // 处理支付成功的逻辑 // ... // 返回成功响应给微信服务器 response.setStatus(HttpServletResponse.SC_OK); response.getWriter().write("SUCCESS"); } else { // 签名验证失败,返回失败响应给微信服务器 response.setStatus(HttpServletResponse.SC_BAD_REQUEST); response.getWriter().write("FAIL"); } } catch (Exception e) { e.printStackTrace(); // 返回失败响应给微信服务器 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); response.getWriter().write("FAIL"); } } private KeyStore getPrivateKey() throws Exception { return SSLContextBuilder .create() .loadKeyMaterial(getClass().getClassLoader().getResourceAsStream(WECHAT_API_CERTIFICATE_PATH), WECHAT_API_CERTIFICATE_PASSWORD.toCharArray()) .build() .getKeyStore(); } } ``` 在上述代码中,我们创建了一个名为 `WeChatH5NotifyHandler` 的类,其中的 `handleNotify` 方法用于处理微信 H5 支付的异步通知。该方法接收 `HttpServletRequest` 和 `HttpServletResponse` 对象作为参数,从请求中获取异步通知的数据,并进行相应的处理逻辑。 在 `handleNotify` 方法中,我们首先创建了一个 `WxPayApiV3Config` 对象,用于配置微信支付 API 的相关参数。其中,我们需要提供应用 ID(`appId`)、商户号(`merchantId`)、微信支付 API 证书的序列号(`privateKeySerialNumber`)以及证书的私钥(`privateKey`)。您需要将这些参数替换为您自己的值。 然后,我们使用 `WxPayApiV3` 实例来解析异步通知数据,并验证签名。如果签名验证成功,则表示支付成功,可以进行相应的处理逻辑,并返回成功响应给微信服务器。如果签名验证失败,则返回失败响应给微信服务器。 请注意,以上示例代码仅供参考,具体的实现可能因应用的需求而有所不同。您需要根据实际情况进行修改和完善。另外,在真实的项目中,请确保您已正确配置和保护微信支付 API 证书的私钥。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值