Paypal REST Api - 来自 RefreshToken 的 AccessToken returns "Invalid_Request"

Paypal REST Api - AccessToken from a RefreshToken returns "Invalid_Request"

Firstly, all keys are related to the SANDBOX environment

过去几天我一直在与 PayPal REST API 作斗争,我试图让我的应用程序的用户登录并允许我访问他们的帐户以执行诸如此类的服务作为退款、付款匹配等

到目前为止,我有一个内置浏览器的 Winforms 应用程序,我将我的用户重定向到:

https://www.sandbox.paypal.com/webapps/auth/protocol/openidconnect/v1/authorize?client_id=AXg4eyTyKDAhYooB2rHgbt1FNHIr9Mh45EW0H1FPxnOKkt4j8MdyiTjJp1ELRhf15XC7hAe9QYrDG_Eq&response_type=code&scope=openid&redirect_uri=http://XXX/Paypal/Confirm

他们登录... 内置浏览器扫描地址并收集返回的 'code'。然后,我从这里 POST 到 Paypal (/v1/identity/openidconnect/tokenservice) grant_type 'authorization_code' 并收集 AccessToken 和 RefreshToken(我想重复使用)。

在我想使用较早的 RefreshToken 请求另一个 AccessToken 之前,这一切都完美无缺。

这是返回的 JSON 对象:

{{
  "token_type": "Bearer",
  "expires_in": "28800",
  "refresh_token": "o_u5L17nQ4takc5ek_6QGMWl2lZA0jQThpMhURowJKNm6lBPFdkaLUzy0VFwXRg9xRA-ApjDkAIZm6hys_Yg1sLyjceaHIlGIKX_grDBeT5fOeEsPFKg6R9lHp8",
  "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJBWGc0ZXlUeUtEQWhZb29CMnJIZ2J0MUZOSElyOU1oNDVFVzBIMUZQeG5PS2t0NGo4TWR5aVRqSnAxRUxSaGYxNVhDN2hBZTlRWXJER19FcSIsImF1dGhfdGltZSI6MTQ2NTgyOTc4MCwiaXNzIjoiaHR0cHM6Ly93d3cucGF5cGFsLmNvbSIsInNlc3Npb25JbmRleCI6IjIyYjJmNzRkMDA2YzExY2I4N2U3ZGZkY2Q3YjJjNWU0M2RhODljNDYiLCJpYXQiOjE0NjU4Mjk3ODUsImV4cCI6Mjg4MDAsInVzZXJfaWQiOiJodHRwczovL3d3dy5wYXlwYWwuY29tL3dlYmFwcHMvYXV0aC9pZGVudGl0eS91c2VyL0F6V0VmSUtFdE1ldU1SN3laYS1LbkhOSTBPU2x1S2E1N1hVY082VE5sQ1EifQ==.q-JCp-d93CCaS0TgCdMqi9yVmHMzyAID7SbI7O81YwY",
  "access_token": "A015mqkkXEVVq0Va0BexS.hhQE0Dlzm36eKNS8-4CVLiIZs"
}}
    ChildrenTokens: Count = 5
    Count: 5
    First: {"token_type": "Bearer"}
    HasValues: True
    Last: {"access_token": "A015mqkkXEVVq0Va0BexS.hhQE0Dlzm36eKNS8-4CVLiIZs"}
    [Next]: Nothing
    Parent: Nothing
    Path: ""
    Previous: Nothing
    Root: {{
  "token_type": "Bearer",
  "expires_in": "28800",
  "refresh_token": "o_u5L17nQ4takc5ek_6QGMWl2lZA0jQThpMhURowJKNm6lBPFdkaLUzy0VFwXRg9xRA-ApjDkAIZm6hys_Yg1sLyjceaHIlGIKX_grDBeT5fOeEsPFKg6R9lHp8",
  "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJBWGc0ZXlUeUtEQWhZb29CMnJIZ2J0MUZOSElyOU1oNDVFVzBIMUZQeG5PS2t0NGo4TWR5aVRqSnAxRUxSaGYxNVhDN2hBZTlRWXJER19FcSIsImF1dGhfdGltZSI6MTQ2NTgyOTc4MCwiaXNzIjoiaHR0cHM6Ly93d3cucGF5cGFsLmNvbSIsInNlc3Npb25JbmRleCI6IjIyYjJmNzRkMDA2YzExY2I4N2U3ZGZkY2Q3YjJjNWU0M2RhODljNDYiLCJpYXQiOjE0NjU4Mjk3ODUsImV4cCI6Mjg4MDAsInVzZXJfaWQiOiJodHRwczovL3d3dy5wYXlwYWwuY29tL3dlYmFwcHMvYXV0aC9pZGVudGl0eS91c2VyL0F6V0VmSUtFdE1ldU1SN3laYS1LbkhOSTBPU2x1S2E1N1hVY082VE5sQ1EifQ==.q-JCp-d93CCaS0TgCdMqi9yVmHMzyAID7SbI7O81YwY",
  "access_token": "A015mqkkXEVVq0Va0BexS.hhQE0Dlzm36eKNS8-4CVLiIZs"
}}
    [Type]: Object {1}
    Results View: Expanding the Results View will enumerate the IEnumerable
    Dynamic View: Expanding the Dynamic View will get the dynamic members for the object

就像之前对“/v1/identity/openidconnect/tokenservice”的请求一样(有效!)我再次 POST,这次是 grant_type of 'refresh_token'。这次响应是异常的:

"Unable to refresh access token - invalid_request - https://developer.paypal.com/docs/api/#errors"}
    Data: {System.Collections.ListDictionaryInternal}
    HResult: -2146233079
    HelpLink: Nothing
    InnerException: {"The remote server returned an error: (400) Bad Request."}
    Message: "Unable to refresh access token - invalid_request - https://developer.paypal.com/docs/api/#errors"
    Response: Nothing
    Source: "PPTest_RESTSDK"
    StackTrace: "   at PPTest_RESTSDK.Wrapper.WebRequest.Post(Dictionary`2 Contents, String RelativeURL, String AccessToken) in C:\Development\DELME\_PPTest_RESTSDK\PPTest_RESTSDK\Wrapper.vb:line 432" & vbCrLf & "   at PPTest_RESTSDK.Wrapper.RegisterByRefreshToken() in C:\Development\DELME\_PPTest_RESTSDK\PPTest_RESTSDK\Wrapper.vb:line 294"
    Status: UnknownError {16}
    TargetSite: {System.String Post(System.Collections.Generic.Dictionary`2[System.String,System.String], System.String, System.String)}

为了消除我的代码有问题的假设,我使用 POSTMAN(Chrome 插件)重新创建了它。 运行 这也将重现我所看到的完全相同的错误 - 见下文。

授权是我的 "client:secret" 的 Base64 编码版本,它等于:

Basic QVhnNGV5VHlLREFoWW9vQjJySGdidDFGTkhJcjlNaDQ1RVcwSDFGUHhuT0trdDRqOE1keWlUakpwMUVMUmhmMTVYQzdoQWU5UVlyREdfRXE6RUlYdklvQ3A1bVNRNDZ4RmhtS2VxbGR4anBzMGNIUkxBdTRFZnJnTXZBN3VRMXBaVFN0dWwyTlE1OVNIcjVydEYyeHZYVUNOOWxCT1FEd1g=

客户: AXg4eyTyKDAhYooB2rHgbt1FNHIr9Mh45EW0H1FPxnOKkt4j8MdyiTjJp1ELRhf15XC7hAe9QYrDG_EqSecret: EIXvIoCp5mSQ46xFhmKeqldxjps0cHRLAu4EfrgMvA7uQ1pZTStul2NQ59SHr5rtF2xvXUCN9lBOQDwX

这与 POSTMAN 中的结果相同:

有人能告诉我到底哪里做错了吗?我将不胜感激!!

经过几个小时的摆弄,我终于意识到了这个问题。

默认情况下,Paypal Developer 中的应用程序未被授予请求身份的权利。

设置App时,需要select并在'My Apps + Credentials'页面上完整配置信息。一旦我这样做,refresh_token 现在将刷新。

我对 Paypal 非常恼火,因为它允许我请求 access_token 并且还给我返回如此可悲的一般错误!!

希望这个启示对以后的人有所帮助!!