使用PHP API创建PayPal计费协议后,如何在IPN中获取并解密Billing AgreementId?
如何在PayPal IPN中获取并解密Billing AgreementId?
当然可以在IPN通知里拿到Billing AgreementId!你提到的那个加密字段,其实是PayPal返回的encrypted_billing_agreement_id,下面我给你拆解下获取和解密的具体步骤:
一、确认IPN中的目标字段
当IPN触发和计费协议相关的事件(比如协议创建成功、定期付款完成等)时,IPN的POST数据里会包含encrypted_billing_agreement_id这个字段,也就是你截图里看到的加密值。
二、解密加密的Billing AgreementId(PHP实现)
因为你是用PHP开发的,这里直接给你适配PHP的解密方案:
1. 准备PayPal公钥
首先你需要从PayPal开发者平台获取对应环境的公钥:
- 登录PayPal开发者账号,进入你的应用详情页
- 找到IPN加密相关的设置板块,下载对应环境(沙箱/生产)的公钥文件(通常是
.pem格式)
2. 编写PHP解密代码
利用PHP的OpenSSL扩展来完成解密操作,注意要先对加密字段做base64解码,示例代码如下:
// 从IPN的POST数据中获取加密的协议ID $encryptedAgreementId = $_POST['encrypted_billing_agreement_id']; // 读取你下载的PayPal公钥文件 $paypalPublicKey = file_get_contents('/your/path/to/paypal_public_key.pem'); // 先对加密字符串进行base64解码 $encryptedData = base64_decode($encryptedAgreementId); // 执行解密操作 $decryptedAgreementId = ''; // 使用OAEP填充模式,这是PayPal要求的解密方式 openssl_public_decrypt($encryptedData, $decryptedAgreementId, $paypalPublicKey, OPENSSL_PKCS1_OAEP_PADDING); // 现在$decryptedAgreementId就是明文的Billing AgreementId了 var_dump($decryptedAgreementId);
3. 关键注意事项
- 环境匹配:沙箱环境必须用沙箱公钥,生产环境用生产公钥,混用会直接导致解密失败。
- IPN真实性验证:在解密之前,一定要先验证IPN消息的合法性!把收到的所有POST数据原封不动回传给PayPal的验证URL(沙箱:
https://ipnpb.sandbox.paypal.com/cgi-bin/webscr,生产:https://ipnpb.paypal.com/cgi-bin/webscr),只有收到PayPal返回的VERIFIED,再进行解密操作,避免恶意请求。 - OpenSSL扩展:确保你的PHP环境已经启用了OpenSSL扩展,否则
openssl_public_decrypt函数无法正常运行。
内容的提问来源于stack exchange,提问作者Veerankutty VP
相关产品推荐
相关产品推荐

