如何撤销PayPal第三方商家授权及解决权限不足问题
问题描述
我尝试对第三方商家、intent为authorize的交易执行void操作,代码如下:
import paypal from "@paypal/checkout-server-sdk"; ... const req = new paypal.payments.AuthorizationsVoidRequest(id); const voidRequest = await client.execute(req); const refundId = voidRequest.headers['paypal-debug-id'];
但触发错误:
Authorization failed due to insufficient permissions. You do not have permission to access or perform operations on this resource.
根据PayPal官方文档说明:
三方交易中,代商家管理API调用的合作伙伴必须通过
PayPal-Auth-Assertion请求头,或者带target_subject的access token来标识商家。
我的疑问:
- 如何获取商家的相关权限?
- 是否需要给商家添加
connect with paypal按钮? - 如果只用
PayPal-Auth-Assertion头,具体该怎么操作?比如如何获取商家的access_token/client_id?
我自己尝试的代码示例:
... req.headers['PayPal-Auth-Assertion'] = generateAuthAssertionHeader("XXXX@XXXX.com"); ... const generateAuthAssertionHeader = async email => { const auth_1 = Buffer.from('{"alg":"none"}').toString('base64'); const auth_2 = Buffer.from(`{"email":"${email}","iss":"${PAYPAL_CLIENT_ID}"}`).toString('base64'); //这里用我的PAYPAL_CLIENT_ID还是商家的?如何获取商家的PAYPAL_CLIENT_ID const auth_assertion_header = `${auth_1}.${auth_2}.`; return auth_assertion_header; };
解决方案
方案一:使用PayPal-Auth-Assertion请求头
iss字段说明:这里的PAYPAL_CLIENT_ID是你的合作伙伴账号的Client ID,不需要商家的Client ID。商家的信息仅通过email字段传入即可,确保该邮箱是商家PayPal账号的关联邮箱。- 权限前提:不需要让商家点击
connect with paypal按钮,但你必须是PayPal正式合作伙伴,且已在PayPal合作伙伴后台完成该商家的关联配置,否则断言头会无效。 - 代码修正:你的当前代码逻辑没问题,只要替换正确的合作伙伴Client ID和商家邮箱即可。
方案二:使用带target_subject的access token
- 获取token:调用PayPal OAuth接口时,添加
target_subject参数,值为商家的PayPal商家ID(不是邮箱):
POST /v1/oauth2/token Content-Type: application/x-www-form-urlencoded grant_type=client_credentials&target_subject=MERCHANT_PAYPAL_ID
- 使用方式:用这个返回的access token初始化PayPal客户端,调用void接口时会自动关联目标商家,无需额外添加断言头。
- 权限前提:同样要求你是PayPal认证合作伙伴,且已完成与商家的关联绑定。
核心注意事项
不管用哪种方案,你必须先成为PayPal认证的合作伙伴,且在PayPal合作伙伴平台完成与目标商家的关联绑定。普通开发者账号没有代第三方商家执行此类交易操作的权限,如果还未成为合作伙伴,需要先申请PayPal Partner Program并完成资质审核。
内容的提问来源于stack exchange,提问作者c137
相关产品推荐
相关产品推荐

