curl 需要对urllib进行身份验证,请求使用Python中的条带

i5desfxk  于 2022-11-13  发布在  Python
关注(0)|答案(3)|浏览(186)

我尝试向Stripe API(一个支付API)发出请求,以获得API给出的json响应。我尝试了在Python课程中找到的以下代码,但由于API需要进行身份验证才能获得响应,我不知道如何在请求中添加这些数据。
在一个curl请求中将它制作成这样:

curl https://api.stripe.com/v1/checkout/sessions   -u pk_test_51LoUz3BgfM0E8ZiCV8UO79gw8zw7fhSgHUEAVj4wS7igs5D4kKiNsxXGeKQEUhorImNUiCxCNNtidwNkhFPUHP4i0060lsvsbw:   -d success_url="http://127.0.0.1:5500/pages/success.html"   -d cancel_url="http://127.0.0.1:5500/pages/nosuccess.html"   -d "line_items[0][price]"=price_1LvNRkBgfM0E8ZiCTSiaNvNL   -d "line_items[0][quantity]"=1 -d mode=subscription -d client_reference_id="123" -d customer_email="email@email.com" -d client_reference_id="tokenized" -d phone_number_collection["enabled"]=true

这将在您的条带帐户中创建一个新的 checkout 会话,响应是一个包含 checkout 会话信息的json。

我在curl请求中使用的授权是publishable_key的“-u”值,后跟":“,这意味着不需要密码

但是当我尝试用Python编写时,我得到了以下错误:

Traceback (most recent call last):
  File "/home/pau/Desktop/bsnbl/Backend/borrar.py", line 17, in <module>
    respuesta = urllib.request.urlopen(request)
  File "/usr/lib/python3.8/urllib/request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python3.8/urllib/request.py", line 531, in open
    response = meth(req, response)
  File "/usr/lib/python3.8/urllib/request.py", line 640, in http_response
    response = self.parent.error(
  File "/usr/lib/python3.8/urllib/request.py", line 569, in error
    return self._call_chain(*args)
  File "/usr/lib/python3.8/urllib/request.py", line 502, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.8/urllib/request.py", line 649, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 401: Unauthorized

Python代码:

import urllib.request
import json

# Debido a cambios en la libreria ahora se deben pasar algunos cabeceros html
paymentInfo = '-u pk_test_51LoUz3BgfM0E8ZiCV8UO79gw8zw7fhSgHUEAVj4wS7igs5D4kKiNsxXGeKQEUhorImNUiCxCNNtidwNkhFPUHP4i0060lsvsbw:   -d success_url="http://127.0.0.1:5500/pages/success.html"   -d cancel_url="http://127.0.0.1:5500/pages/nosuccess.html"   -d "line_items[0][price]"=price_1LvNRkBgfM0E8ZiCTSiaNvNL   -d "line_items[0][quantity]"=1 -d mode=subscription -d client_reference_id="123" -d customer_email="abrix07@gmail.com" -d client_reference_id="tokenized" -d phone_number_collection["enabled"]=true'
res = bytes(paymentInfo,'utf-8')
print(str(type(res))) 
request = urllib.request.Request(
    'https://api.stripe.com/v1/checkout/sessions',
    data=res,
    headers={
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
    }
)
respuesta = urllib.request.urlopen(request)
print('1. ',respuesta)
cuerpo_respuesta = respuesta.read()
print(cuerpo_respuesta)
#Procesamos la respuesta json
json_respuesta = json.loads(cuerpo_respuesta.decode("utf-8"))
print(json_respuesta)

为了安全起见,我正在使用Stripe帐户的可发布密钥,如果您尝试使用可发布的代码,它将要求您提供密钥,我不能在这里给予密钥。不便之处,敬请原谅

5ktev3wc

5ktev3wc1#

请尝试以下代码:

from requests import post

response = post(url='https://api.stripe.com/v1/checkout/sessions', headers={
    'Authorization': 'bearer pk_test_51LoUz3BgfM0E8ZiCV8UO79gw8zw7fhSgHUEAVj4wS7igs5D4kKiNsxXGeKQEUhorImNUiCxCNNtidwNkhFPUHP4i0060lsvsbw',
}, data={
    'success_url': 'http://127.0.0.1:5500/pages/success.html',
    'cancel_url': 'http://127.0.0.1:5500/pages/nosuccess.html',
    'line_items[0][price]': 'price_1LvNRkBgfM0E8ZiCTSiaNvNL',
    'line_items[0][quantity]': 1,
    'mode': 'subscription',
    'client_reference_id': '123',
    'customer_email': 'abrix07@gmail.com',
    'phone_number_collection[enabled]': True
})

print(response)
print(response.json())

还要检查,你的价格是经常性的
如果您喜欢使用“urllib”,可以使用以下代码:

import urllib.request
import urllib.parse
import json

# Debido a cambios en la libreria ahora se deben pasar algunos cabeceros html

res = urllib.parse.urlencode({
    'success_url': 'http://127.0.0.1:5500/pages/success.html',
    'cancel_url': 'http://127.0.0.1:5500/pages/nosuccess.html',
    'line_items[0][price]': 'price_1LvNRkBgfM0E8ZiCTSiaNvNL',
    'line_items[0][quantity]': 1,
    'mode': 'subscription',
    'client_reference_id': '123',
    'customer_email': 'abrix07@gmail.com',
    'phone_number_collection[enabled]': True
})

print(str(type(res)))
request = urllib.request.Request(
    'https://api.stripe.com/v1/checkout/sessions',
    data=res.encode('ascii'),
    headers={
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36',
        'Authorization': 'bearer pk_test_51LoUz3BgfM0E8ZiCV8UO79gw8zw7fhSgHUEAVj4wS7igs5D4kKiNsxXGeKQEUhorImNUiCxCNNtidwNkhFPUHP4i0060lsvsbw',
        'Content-Type': 'application/x-www-form-urlencoded'
    }
)

respuesta = urllib.request.urlopen(request)
print('1. ',respuesta)
cuerpo_respuesta = respuesta.read()
print(cuerpo_respuesta)
#Procesamos la respuesta json
json_respuesta = json.loads(cuerpo_respuesta.decode("utf-8"))
print(json_respuesta)
wz8daaqr

wz8daaqr2#

使用urllib模块时,您需要在请求中设置Authorization头,以根据Stripedocumentation添加API密钥。

request = urllib.request.Request('https://api.stripe.com/v1/checkout/sessions',
  data=res,
  headers={
    'Authorization: Bearer sk_xxx'
  }
}
zdwk9cvp

zdwk9cvp3#

我在这个链接中找到了Python API:https://stripe.com/docs/api/checkout/sessions/create?lang=python
默认情况下,它显示为curl,但当您添加lang=python时,就会得到python API代码

相关问题