大家好,我是 LINE 的技術傳教士立花,負責協助開發商使用 LINE API 並在商務上取得成功。
API Expert 的加川澄廣先生發布日前釋出的 LINE Pay API v3 的 Python 版 SDK ,以下介紹其使用方法。
v3 的變更點
v3 的變更點如下。
- 認證機制變更
- 不須登記 White IP
- 結帳商品的設定更有彈性
- Checkout (結帳完成時也可以輸入配送地址)
關於詳細內容,請參照以下。
Python 版 SDK之介紹
Repository
Repository 如下所示。
https://github.com/sumihiro3/line-pay-sdk-python
運作環境
Python >= 3.6
安裝
在 PyPI 完成註冊,可透過 pip
直接安裝。
$ pip install line-pay
各 API 的使用方法
專案範本
為了方便每個人都可以自行確認運作, 已經與 kintone 合作,製作可以體驗LINE Pay API功能的程式 ,並公開於 github。使用方法則記載於 README 中,若有需要,請下載參閱。
https://github.com/stachibana/line-pay-v3-python-sdk-sample
另外,個人業者目前只要通過審查,也可以正式使用 LINE Pay API。關於詳情,請參照以下報導。
使用LINE Pay API,在個人開發的Bot中,加入結帳功能 (日文)
Request API
進行結帳的 Request 的時候,透過 options.payment.capture
的値指定False
,可將授權與請款分開作業。若將授權與請款分離,則需透過 Capture API 來進行請款。
order_id = str(uuid.uuid4())
amount = 1
currency = "JPY"
request_options = {
"amount": amount,
"currency": currency,
"orderId": order_id,
"packages": [
{
"id": "package-999",
"amount": 1,
"name": "Sample package",
"products": [
{
"id": "product-001",
"name": "Sample product",
"imageUrl": "https://placehold.jp/99ccff/003366/150x150.png?text=Sample%20product",
"quantity": 1,
"price": 1
}
]
}
],
"options": {
"payment": {
"capture": True|False
}
},
"redirectUrls": {
"confirmUrl": request.host_url.replace('http', 'https') + "confirm",
"cancelUrl": request.host_url.replace('http', 'https') + "cancel"
}
}
response = api.request(request_options)
Confirm API
跳轉到 Request API 所提供的結帳用連結,由使用者同意後,此 API 可讓商店完成結帳。
transaction_id = int(request.args.get('transactionId'))
response = api.confirm(
transaction_id,
amount,
currency
)
Capture API
此 API 可取得確定授權狀態的結帳資訊。
response = api.capture(transaction_id, amount, currency)
Void API
此 API 可取消授權。
response = api.void(transaction_id)
Refund API
此 API 可退還已確定的銷售款項。退款可全額退款或指定金額(部份退款)。
# 全額
response = api.refund(transaction_id)
# 指定金額
response = api.refund(transaction_id, 50.0)
Payment Details API
此 API 可查閱交易明細。
details = api.payment_details(transaction_id)
Pay Preapproved API
此 API 可進行自動結帳(此功能可在預先取得使用者同意下,下次不用經過使用者同意,即可進行結帳) 。自動結帳所必須的 RegKey
,可藉由在執行 Request API 時的參數 options.payment.payType
中,指定為 PREAPPROVED
來取得。
RegKey取得
# Request
order_id = str(uuid.uuid4())
amount = 1
currency = "JPY"
request_options = {
"amount": amount,
"currency": currency,
"orderId": order_id,
"packages": [
{
"id": "package-999",
"amount": 1,
"name": "Sample package",
"products": [
{
"id": "product-001",
"name": "Sample product",
"imageUrl": "https://placehold.jp/99ccff/003366/150x150.png?text=Sample%20product",
"quantity": 1,
"price": 1
}
]
}
],
"options": {
"payment": {
"capture": True,
"payType": "PREAPPROVED"
}
},
"redirectUrls": {
"confirmUrl": request.host_url.replace('http', 'https') + "confirm",
"cancelUrl": request.host_url.replace('http', 'https') + "cancel"
}
}
response = api.request(request_options)
# Confirm
response = api.confirm(
transaction_id,
amount,
currency
)
if 'regKey' in response['info']:
reg_key = response['info']['regKey']
# Pay preapproved
order_id = str(uuid.uuid4())
amount = 1.0
currency = "JPY"
product_name = "訂閱項目"
response = api.pay_preapproved(reg_key, product_name, amount, currency, order_id, True)
Checkout (註: 此功能目前僅開放日本申請)
此 API 可根據使用者指定的配送地址,建議配送方法與運費,並同時結帳。需安裝指定 options.shipping
的値、收件住址、以及送回配送方法的 Inquiry ShippingMethods API。
※ 本 API 無法在Sandbox環境中使用。
# Request
order_id = str(uuid.uuid4())
amount = 1
currency = "JPY"
request_options = {
"amount": amount,
"currency": currency,
"orderId": order_id,
"packages": [
{
"id": "package-999",
"amount": 1,
"name": "Sample package",
"products": [
{
"id": "product-001",
"name": "Sample product",
"imageUrl": "https://placehold.jp/99ccff/003366/150x150.png?text=Sample%20product",
"quantity": 1,
"price": 1
}
]
}
],
"options": {
"payment": {
"capture": True
},
"shipping": {
"type": "SHIPPING",
"feeInquiryUrl": request.host_url.replace('http', 'https') + "v1/shippings/methods/get/"
}
},
"redirectUrls": {
"confirmUrl": request.host_url.replace('http', 'https') + "confirm",
"cancelUrl": request.host_url.replace('http', 'https') + "cancel"
}
}
response = api.request(request_options)
# Inquiry ShippingMethods API
@app.route('/v1/shippings/methods/get/', methods=["POST"])
def inquiryShippingMethods():
result = {
"returnCode": "0000",
"returnMessage": "Example",
"info": {
"shippingMethods": [
{
"id": "hoge",
"name": "hogehoge express",
"amount": "1000",
"toDeliveryYmd": datetime.datetime.now().strftime("%Y%m%d")
}
]
}
}
return jsonify(result)
總結
加川先生感謝您。多虧你分享的 SDK,編寫的程式碼才能如此簡潔。另外,如果還有其他人在寫 SDK,請務必告訴我喔。