首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未经授权的PayPal live payments

未经授权的PayPal live payments
EN

Stack Overflow用户
提问于 2018-08-22 18:33:34
回答 1查看 298关注 0票数 0

我遇到了问题,让PayPal接受我的应用程序的实时支付。我使用的是Azure服务器,用C#编写代码,带有一个基于Xamarin的安卓客户端应用程序。我可以使用PayPal沙箱让一切正常工作,但当我切换到活动凭据时,它会失败。以下是我的付款流程:

1)在我的安卓应用中,启动PayPal应用授权支付。这将返回一个授权码。这段代码类似于C21AAHHVxYjktRk82SomDGL6ssqd85LLmso5uxADtMW4ABEyieWdC_6mUxWK84hfeteotgeorgiengeoiugHUWRiu-Q

2)将代码向上传递到服务器;使用代码,使用grant_type为client_credentials的代码来获取持有者令牌。返回的token类似于:

代码语言:javascript
复制
"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请求和持有者token一起授权支付。REST请求将如下所示:

代码语言:javascript
复制
{
    "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"
        }
    }

请注意,我们必须在我们的请求中设置收款人,因为我们自己没有收到付款。

我得到的回应是这样的:

代码语言:javascript
复制
"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)执行支付并将响应返回给客户端app。这是执行付款的请求,我使用的是步骤(1)中的access_token和https://api.paypal.com/v1/payments/payment/PAY-xxxxxxxxxxxxxxxxxxxxxxx/execute的付款URL:

代码语言:javascript
复制
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方法是一个网络支付流程(即我最终在贝宝的网站上授权支付),而我的系统不使用网络,只有贝宝的移动应用程序。顺便说一句,该应用程序返回的长代码在cURL请求中不起作用。

这里似乎有一些非常错误的地方,但它在沙箱中工作,即使我在步骤1中使用authorization_code的grant_type (但活着,在步骤2中grant_type失败)。我使用的是正确的实时PayPal id和密钥。对于我在这里做错了什么,有人有什么建议吗?我已经尝试过PayPal支持,但他们只建议使用cURL,如果没有事务的client_id,我无法做到这一点。

非常感谢。

EN

回答 1

Stack Overflow用户

发布于 2018-08-31 17:40:51

我终于从PayPal得到了答案,显然他们必须在他们启用未来付款之前批准您的帐户,这是我最初用来获得授权类型的authorization_code,然后应该允许我在REST响应中设置收款人。我在上面概述的步骤中所做的只是遵循PayPal技术支持的说明,这无论如何都不起作用。希望这能解决问题,但如果PayPal将这些信息放在开发人员站点上的某个地方(可能它就埋在那里的某个地方,但我还没有找到它),这将是非常有帮助的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51964912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档