我在让PayPal接受我的应用程序的实时付款方面遇到问题。我正在使用基于Ca编码的Azure服务器以及基于Xamarin的Android客户端应用程序。我可以使用PayPal沙箱进行所有操作,但是当我切换到实时凭据时,它会失败。 这是我的付款流程:
1)在我的Android应用中,启动PayPal应用以授权付款。这将返回授权码。该代码类似于C21AAHHVxYjktRk82SomDGL6ssqd85LLmso5uxADtMW4ABEyieWdC_6mUxWK84hfeteotgeorgiengeoiugHUWRiu-Q
2)将代码传递给服务器;使用具有client_credentials的grant_type的代码来获取承载令牌。返回的令牌是这样的:
"scope": "https://uri.paypal.com/services/subscriptions https://api.paypal.com/v1/payments/.* https://api.paypal.com/v1/vault/credit-card https://uri.paypal.com/services/applications/webhooks https://uri.paypal.com/services/payments/futurepayments openid https://api.paypal.com/v1/vault/credit-card/.*",
"nonce": "2017-12-31T12:07:46ZPYBveV0qcOc2apceqHbTBrXXVsuGCryP05-xxxxxxxxxxx",
"access_token": "A23AAHweO7uu8vuXs45CVOafwqFHGj03riRShISJRnHn4Pr1bzwdDfaG5JkqCT5oZ_pFWGBK-wScOq2JeDERe2USxxxxxxxxxxxxx",
"token_type": "Bearer",
"expires_in": 28800,
"refresh_token": "R23AAFR7MtimwU1AeQ7V6pTw0ugxN4AzOsRr-tBfmChMBAK8IMrJO_WQ6WgLUxbkK8ssvHoPVFFdVVAorNZriMX8gUA1tb-iRzwj7aiQ3_KCv5SDnqjf5j3vxKeZG052Q7WpSbW2zxxxxxxxxxxxxx"
3)提交REST请求以及承载令牌以授权付款。 REST请求将如下所示:
{
"intent": "sale",
"payer": {
"payment_method": "paypal"
},
"transactions": [{
"amount": {
"currency": "GBP",
"total": 1.0
},
"payee": {
"email": "xxxxxxxxxxxxxxxxxx"
},
"description": "Test item",
"payment_options": {
"allowed_payment_method": "INSTANT_FUNDING_SOURCE"
}
}
请注意,由于我们自己没有收到付款,因此我们必须在请求中设置收款人。
我得到的回复是这样的:
"id":"PAY-258208691145776xxxxxxxxx",
"intent":"sale",
"state":"created",
"cart":"1JF69642C9xxxxxxx",
"transactions":[
{
"amount":{
"total":"1.00",
"currency":"GBP"
},
"payee":{
"merchant_id":"xxxxxxxxxxxxxx",
"email":"xxxxxxxxxxxxxxx"
},
"description":"Test item",
"related_resources":[]
}
],
"redirect_urls":{
"return_url":"xxxxxxxxxxxxxxxxx/return?paymentId=PAY-xxxxxxxxxxxxxxxxxxxxxxx",
"cancel_url":"xxxxxxxxxxxxxxxx/cancel"
},
"create_time":"2018-08-20T10:22:19Z",
"update_time":"2018-08-20T10:22:20Z",
"links":
[
{
"href":"https://api.paypal.com/v1/payments/payment/PAY-xxxxxxxxxxxxxxxxxxxxxxx",
"rel":"self","
"method":"GET"
},
{
"href":"https://api.paypal.com/v1/payments/payment/PAY-xxxxxxxxxxxxxxxxxxxxxxx/execute",
"rel":"execute",
"method":"POST"
},
{
"href":"https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-xxxxxxxxxxxxxxxxxxxx",
"rel":"approval_url","method":"REDIRECT"
}
]
到目前为止一切都很好。
4)执行付款,并将响应返回给客户端应用。 这是执行付款的请求,我正在使用步骤(1)中的access_token和https://api.paypal.com/v1/payments/payment/PAY-xxxxxxxxxxxxxxxxxxxxxxx/execute的付款URL:
using (HttpClient client = new HttpClient())
{
try
{
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
client.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue("en-GB"));
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
var responseMessage = await client.GetAsync(paymentURL);
ret1 = await responseMessage.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
return ex.ToString();
}
}
这一切在PayPal的沙箱上都可以正常运行。当我尝试实时运行它时,它在最后一步失败,并出现MALFORMED_REQUEST错误。
因此,我使用cURL(即完全手动,复制并粘贴命令)并使用相同的付款明细进行了测试交易。付款流程略有不同,但有效。但是,我从贝宝(PayPal)那里获得了一个client_id,它在步骤(3)的响应中不存在,所以我无法使用cURL运行我的实际交易,但是我怀疑这是因为cURL方法是一种Web付款流程(即我最终在PayPal的网站上授权付款),而我的系统不使用网络,仅使用PayPal的移动应用程序。顺便说一句,该应用返回的长代码在cURL请求中不起作用。
这里似乎有些错误,但是即使我在步骤1中使用了授权代码的grant_type(但实际上,在步骤2中该grant_type失败),它仍然可以在沙箱中工作。我使用的是正确的实时PayPal ID和机密。 有人对我在这里做错什么有任何建议吗?我已经尝试过PayPal支持,但是他们只建议使用cURL,如果没有用于交易的client_id,我将无法使用。
非常感谢。
答案 0 :(得分:0)
我终于从贝宝(PayPal)那里得到了答案,显然他们必须批准您的帐户才能启用以后的付款,这是我最初用来获取授权类型的授权码的方式,然后应允许我将收款人设置在REST响应。我在上面概述的步骤中所做的只是遵循PayPal技术支持的说明,但该方法始终无法正常工作。希望这可以解决问题,但是如果PayPal将这些信息放在开发人员网站的某个位置(也许它埋在该位置,但我还没有找到),那将真的很有帮助。