Online APIs
OverView
LINE Pay
LINE Payは、LINEのユーザーがLINE Pay加盟店のサイトで利用できる決済システムです。
LINE Payの決済プロセス
LINE Pay加盟店になれば、世界中のすべてのLINEユーザーを顧客として取り込むことができます。また、LINEを通じて加盟店のマーケティングチャネルを拡大することで、売上増大を期待できます。ユーザーがLINE Payを使って支払いをするには、決済を行うサイトがLINE Pay加盟店である必要があります。
LINE Pay加盟店登録の流れ
LINE Pay加盟店に登録すれば、連携のための「Channel Id」と「Channel SecretKey」がSandbox用、Production用でそれぞれ発行されます。加盟店登録の流れは以下のとおりです。
加盟店登録の流れ
- 申し込みページ(https://pay.line.me)にアクセスする。
- 基本情報を記入し、必須書類を提出する。
- 加盟店登録の審査が行われる。
- 手数料および精算周期に同意し、本人確認PINコードを入力する。
- 加盟店登録が完了する。
- 登録完了メールが届く。
一般決済
一般決済では、LINE PayのユーザーはLINE Pay決済画面にて決済手段(残高、チャージ&ペイ、LINEポイント)を選択し、決済情報をパスコードまたはFaceIDで認証します。"Request API"で受け取った加盟店の"confirmUrl"に画面遷移すれば、加盟店サーバー側では"Confirm API"を使用して決済を完了します。
※一部加盟店(LINEグループ内サービス)のみ、決済手段にクレジットカード、銀行口座の選択が可能です。
PCの場合
PCの決済画面ー決済完了
- LINE Payユーザーは、LINEアプリの決済画面にて決済手段を選択し、パスワードを入力する。
- LINE Payサーバーでは決済手段の情報を保存し、決済ステータスを決済可能状態に変更する。
- LINE Payユーザーは、LINEアプリにて決済情報を確認する。
- PCの決済待ち画面では決済ステータスを定期的にチェックする。決済可能状態になれば、決済要求時に受け取った"confirmUrl"に遷移する。
- 加盟店では、LINE Payサーバーに対してConfirm APIを呼び出し、決済を完了する。
スマートフォンの場合
スマートフォンの決済画面ー決済完了
- LINE Payユーザーは、LINEアプリの決済画面にて決済手段を選択し、パスワードを入力する。
- LINE Payサーバーでは決済手段の情報を保存し、決済ステータスを決済可能状態に変更する。
- LINE Payユーザーは、LINEアプリにて決済情報を確認し、画面下部の確認ボタンをタップして決済要求時に受け取った"confirmUrl"に遷移する。
- 加盟店サーバーは、LINE Payサーバーに対してConfirm APIを呼び出し、決済を完了する。
オーソリと売上確定の分離
一般決済と同じですが、Confirm APIを使用して決済を確定すれば、決済ステータスが売上確定待ち状態のまま完了します。LINE Payはオーソリ満了日まで売上確定待ち状態を維持し、加盟店はオーソリ満了日の前に"売上確定(Capture API)"によって決済ステータスを売上確定状態に変更します。
- 売上確定したい場合: Capture APIを呼び出して決済を完了する。
- 売上確定したくない場合: Void APIを呼び出して決済を取り消す。
confirmUrlのServer-to-Server
一般決済におけるconfirmUrlは、加盟店にユーザーの決済承認完了を通知し、ユーザーに決済完了画面に遷移する機能を提供するページです。ユーザーに決済完了画面を表示する必要がない場合は、redirectUrls.confirmUrlTypeを"SERVER"に設定し、画面遷移せずにLINE Payサーバー側でconfirmUrlを呼び出して決済承認を通知します。ユーザーが決済を承認した後、加盟店サーバーからLINE PayサーバーにConfirm APIを呼び出して決済を完了します。
連携の流れは以下のとおりです。
confirmUrlをServer-to-Serverで送信
- 加盟店は、Request APIのredirectUrls.confirmUrlTypeを"SERVER"に設定する。
- LINE Payユーザーは、LINE Pay決済画面に入って決済手段を選択し、パスワードを入力する。
- LINE Payサーバーでは決済情報を保存し、決済要求時に加盟店から受け取ったconfirmUrlを呼び出す。
- 加盟店サーバーは、Confirm APIを呼び出して決済を完了する。confirmUrlに対するレスポンスが正常に返ってこなかった場合は、Confirm APIを呼び出すことができない。
関連API
Checkout (Only Japan)
LINE Payで提供する多様な決済手段(残高、クレジットカード、銀行口座、LINEポイント)とLINEのユーザー情報を利用することで、決済と注文を簡単に行うことができます。
Checkoutの流れ
Checkoutの流れ
- 加盟店は、Request APIを呼び出してLINE Pay側に決済をリクエストする。このとき、Checkoutサービスを有効にするために"shipping.type"を
SHIPPING
に設定する。また、配送方法と送料を照会できるInquiry ShippingMethods APIを実装し、API Urlを"shipping.feeInquiryUrl"に入力してLINE Pay側に提供する。 - Request APIのレスポンスとして返されたpaymentUrlを利用して、ユーザーはLINE Pay決済画面に遷移できる。
- ユーザーは、LINEアプリの決済画面にて商品と決済情報を確認し、配送先を入力する。LINE Payでは、その配送先と注文情報(orderId、transactionId)を基に加盟店の利用可能な配送方法を照会し、ユーザーに表示する。
- ユーザーは、配送方法と決済手段を選択し、LINE Payユーザー認証を利用して安全かつ簡単に決済要求を承認する。
- 決済要求が承認されれば、決済要求時に加盟店から受け取ったconfirmUrlに配送方法と送料の情報が追加され、ユーザーの画面は"confirmUrl"に遷移する。
- 承認済みの決済要求については、confirmUrlを使用して決済完了可能であることを加盟店に渡す。加盟店は、confirmUrlが呼び出された決済要求に対してConfirm APIを呼び出し、決済を完了する。
Checkoutのタイプ
LINE Payでは、"shipping.type"オプションを利用してCheckout機能と一般決済機能を提供しています。ユーザーにCheckout機能を提供するにはSHIPPING
に、一般決済機能を提供するにはNO_SHIPPING
に設定してください。デフォルトではNO_SHIPPING
に設定されています。
Checkout機能を利用する場合は、加盟店 My Pageの以下メニューより設定が必要です。 基本情報の管理 > その他の情報 >LINE Checkout
Highly Recommended
配送方法
LINE Payユーザーが配送先を入力すれば、それに対して配送可能な配送業者や送料、予定配送期間のリストを提供する必要があります。提供すべきAPIの詳細については、Inquiry ShippingMethods APIをご参照ください。
Checkout画面でユーザーが配送先を選択すれば、LINE Pay側はその地域に関する配送情報を加盟店にリクエストします。選択された配送手段と送料は、confirmUrlのクエリ文字列で渡されます。詳細は、confirmUrl Specをご参照ください。
一般的なCheckoutでは、"shipping.feeInquiryType"としてCONDITION
を使用し、配送先によって変わる送料と配送情報を提供します。送料が固定または無料の場合は、FIXED
を選択します。FIXEDを選択すれば、配送先が変更されても、LINE Payは加盟店に配送方法と送料の情報をリクエストしません。
Highly Recommended
配送受取人
Only Japan
受取人情報のfirstName
, lastName
には漢字の名前を、firstNameOptional
, lastNameOptional
にはカタカナの名前を使用します。
関連API
自動決済
自動決済は、決済が必要なタイミングにLINE Payユーザーの追加承認を行わずに、加盟店サーバーとLINE Payサーバー間でPreapproved Pay APIを呼び出して決済を行う機能です。LINE Payユーザーが初回決済プロセス(一般決済プロセスと同じ)を踏むと、加盟店に"RegKey"(自動決済キー)が発行されます。加盟店では"Confirm API"で渡されたRegKeyを保存・管理することで、次回の決済からはLINE Payでユーザー承認プロセスを経ずに"Preapproved Pay API"を使って決済を完了できます。
- 初回決済およびRegKey(自動決済キー)の発行
- 加盟店サーバーからRequest APIを呼び出す。このとき、"options.payment.payType"を"PREAPPROVED"に設定する。
- LINE Pay決済画面にて決済手段とパスワードを確認し、redirectUrls.confirmUrl(Request APIのパラメータ)に遷移する。
- 加盟店サーバーから"Confirm API"のレスポンスとして発行された"RegKey"を管理する。
- 決済が完了する。
- 自動決済
- RegKeyでPreapproved Pay APIを呼び出す。
- 決済が完了する。
自動決済
- 自動決済を停止するためのregKey満了リクエスト
- Expire RegKey APIを呼び出して満了させたいRegKeyを渡す。
- 自動決済キー(RegKey)が満了する。
関連API
Payment APIs
Infra and Tech Support
技術支援の問合せ先
導入方法についての質問、または、内部エラーが発生した場合は、以下の各国の問い合わせ先までメールをお送りください。
担当 | 問い合わせ先 | 対象の国 |
---|---|---|
LINE Pay Japan | dl_tech_support_jp@linecorp.com | 日本 |
LINE Pay Thailand | dl_tech_support_th@linecorp.com | タイ |
LINE Pay Taiwan | dl_tech_support_tw@linecorp.com | 台湾 |
LINE Pay Global | dl_tech_support_global@linecorp.com | その他 |
API接続エンドポイント
Environment | URL | Description |
---|---|---|
Sandbox | https://sandbox-api-pay.line.me | インテグレーション用のテスト環境です。SandboxシミュレーターでLINE Payでの決済を行うことができます。 |
Production | https://api-pay.line.me | 本番環境、および、テスト加盟店環境です。 |
API Authentication
LINE Pay Payment APIのユーザー認証(Authentication)方法について説明します。認証に必要な"Channel ID"と"Channel SecretKey"は、加盟店審査が完了した後に加盟店 My Page(https://pay.line.me)にて確認できます。LINE Payでは、連携を準備するためのSandbox環境を提供しています。Sandboxで使用できるテストチャネル情報(id、secretKey)とProduction環境で使用する実際のチャネル情報(id、secretKey)は、いずれも加盟店 My Pageにて確認できます。
HMAC Signature
- Algorithm : HMAC-SHA256
- Key : Channel Secret (LINE Pay加盟店 My Pageで"Channel Id"と"Channel SecretKey"を提供)
- HTTP Method
- GET : Channel Secret + URI + Query String + nonce
- POST : Channel Secret + URI + Request Body + nonce
HTTP Method : GET
Signature = Base64(HMAC-SHA256(Your ChannelSecret, (Your ChannelSecret + URL Path + Query String + nonce)))
Query String : ?
を除いたクエリ文字列(例 : Name1=Value1&Name2=Value2...)
HTTP Method : POST
Signature = Base64(HMAC-SHA256(Your ChannelSecret, (Your ChannelSecret + URL Path + RequestBody + nonce)))
Common HTTP Request Header
LINE Pay APIs認証の共通ヘッダーについて詳しく説明します。認証のためのHTTPヘッダーの情報は、下表のとおりです。"Channel Id"はX-LINE-ChannelId
に、"Channel SecretKey"で作成した署名の情報はX-LINE-Authorization
に指定します。X-LINE-Authorization-Nonce
には、同じ署名が使われることを防止するために、1回限りのランダムな値を生成して指定してください。
Key | Data Type | Requirement | Description |
---|---|---|---|
Content-Type | String | Y | application/json |
X-LINE-ChannelId | String | Y | Payment Integration Information - Channel ID |
X-LINE-MerchantDeviceProfileId | String | N | Offline Support - Device Type |
X-LINE-Authorization-Nonce | String | Y | UUID or Request timestamp |
X-LINE-Authorization | String | Y | HMAC Base64 Signature |
X-LINE-Authorization-Nonce
HMAC署名を作成する際に使い捨て乱数であるnonceを利用することで、同じ署名の作成を遮断し、悪意のある目的で同じリクエストを送り続けることを防ぐことができます。使い捨てnonceとしては、UUID 1 or 4またはタイムスタンプを利用できます。
Nonce作成
String nonce = UUID.randomUUID().toString();
Sample
HMACのサンプルコード
import java.util.UUID;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.HmacUtils;
public final class HmacSignature {
private HmacSignature(){}
public static String encrypt(final String keys, final String data) {
return toBase64String(HmacUtils.getHmacSha256(keys.getBytes()).doFinal(data.getBytes()));
}
public static String toBase64String(byte[] bytes) {
byte[] byteArray = Base64.encodeBase64(bytes);
return new String(byteArray);
}
public static void main(String[] args) {
CheckoutPaymentRequestForm form = new CheckoutPaymentRequestForm();
form.setAmount(new BigDecimal("100"));
form.setCurrency("JPY");
form.setOrderId("merchant_order_id");
ProductPackageForm productPackageForm = new ProductPackageForm();
productPackageForm.setId("package_id");
productPackageForm.setName("shop_name");
productPackageForm.setAmount(new BigDecimal("100"));
ProductForm productForm = new ProductForm();
productForm.setId("product_id");
productForm.setName("product_name");
productForm.setImageUrl("");
productForm.setQuantity(new BigDecimal("10"));
productForm.setPrice(new BigDecimal("10"));
productPackageForm.setProducts(Lists.newArrayList(productForm));
form.setPackages(Lists.newArrayList(productPackageForm));
RedirectUrls redirectUrls = new RedirectUrls();
redirectUrls.setAppPackageName("");
redirectUrls.setConfirmUrl("");
form.setRedirectUrls(redirectUrls);
String ChannelSecret = "a917ab6a2367b536f8e5a6e2977e06f4";
String requestUri = "/v3/payments/request";
String nonce = UUID.randomUUID().toString();
String signature = encrypt(ChannelSecret, ChannelSecret + requestUri + toJson(form) + nonce);
}
}
Request API
LINE Pay決済をリクエストします。このとき、ユーザーの注文情報と決済手段を設定できます。リクエストに成功するとLINE Pay取引番号が発行されます。この取引番号を利用して、決済完了・返金を行うことができます。
API Spec
POST /v3/payments/request
- Connection Timeout : 5秒
- Read Timeout : 20秒
Request
Request Body
Item | Data type | Length | Requirement | Description |
---|---|---|---|---|
amount | Number | Y | 決済金額= sum(packages[].amount) + sum(packages[].userFee) + options.shipping.feeAmount |
|
currency | String | 3 | Y | 決済通貨(ISO 4217) |
orderId | String | 100 | Y | 加盟店の注文番号 |
packages[].id | String | 50 | Y | パッケージリストのユニークなID |
packages[].amount | Number | Y | パッケージ内の商品金額合計=sum(products[].quantity * products[].price) |
|
packages[].userFee | Number | N | ユーザー手数料 : 決済金額の中に手数料項目が含まれている場合に返す。 | |
packages[].name | String | 100 | N | パッケージの名前(または、加盟店内の出店業者の名前) |
packages[].products[].id | String | 50 | N | 加盟店の販売商品のID |
packages[].products[].name | String | 4000 | Y | 販売商品の名前 |
packages[].products[].imageUrl | String | 500 | N | 販売商品の画像URL |
packages[].products[].quantity | Number | Y | 商品数 | |
packages[].products[].price | Number | Y | 各商品の決済金額 | |
packages[].products[].originalPrice | Number | N | 各商品の元の金額 | |
redirectUrls.appPackageName | String | 4000 | N | Androidでのアプリ間遷移時にフィッシングを防止するための情報 |
redirectUrls.confirmUrl | String | 500 | Y | ユーザーが決済要求を承認した後に遷移する加盟店のURL |
redirectUrls.confirmUrlType | String | N | ユーザーが決済要求を承認した後のconfirmUrlのオプション |
|
redirectUrls.cancelUrl | String | 500 | Y | LINEアプリの決済画面でLINE Payユーザーが決済を取り消した場合に遷移するURL |
options.payment.capture | Boolean | N | 自動売上確定の有無 |
|
options.payment.payType | String | N | 決済タイプ |
|
options.display.locale | String | N | 決済待ち画面の言語コード。デフォルトは英語(en)。 |
|
options.display.checkConfirmUrlBrowser | Boolean | N | confirmUrlへの遷移時に使われるブラウザ(Webビュー含む)の確認有無 |
|
options.shipping.type | String | N | 配送先オプション |
|
options.shipping.feeAmount | Number | N | 送料 | |
options.shipping.feeInquiryUrl | String | 500 | N | 配送方法を照会するURL |
options.shipping.feeInquiryType | String | N | 送料照会タイプ |
|
options.shipping.address.country | String | 2 | N | 配送先の国 |
options.shipping.address.postalCode | String | 10 | N | 配送先の郵便番号 |
options.shipping.address.state | String | 100 | N | 配送先の都道府県 |
options.shipping.address.city | String | 100 | N | 配送先の市町村 |
options.shipping.address.detail | String | 1000 | N | 配送先の番地 |
options.shipping.address.optional | String | 1000 | N | 配送先の追加情報 |
options.shipping.address.recipient.firstName | String | 200 | N | 受取人の名前(名) |
options.shipping.address.recipient.lastName | String | 200 | N | 受取人の名前(姓) |
options.shipping.address.recipient.firstNameOptional | String | 200 | N | 受取人のカナ名(名) |
options.shipping.address.recipient.lastNameOptional | String | 200 | N | 受取人のカナ名(姓) |
options.shipping.address.recipient.email | String | 100 | N | 受取人のメールアドレス |
options.shipping.address.recipient.phoneNo | String | 100 | N | 受取人の電話番号 |
options.extra.branchName | String | 200 | N | 決済を要求した店舗名(100文字まで表示) |
options.extra.branchId | String | 32 | N | ブランチID 決済がリクエストされた場所を識別するために利用します。 英字、数字、記号を利用できます。 |
Response Body
Item | Data type | Length | Description |
---|---|---|---|
returnCode | String | 4 | 結果コード |
returnMessage | String | 300 | 結果メッセージ |
info.transactionId | Number | 19 | 取引番号 |
info.paymentAccessToken | String | 12 | LINE PayでScannerを利用する代わりにコードを入力する場合、そのコード値 |
info.paymentUrl.app | String | 300 | 決済画面に遷移するアプリのURL |
info.paymentUrl.web | String | 300 | 決済画面に遷移するWeb URL |
Return Codes
Code | Description |
---|---|
0000 | 成功 |
1104 | 加盟店が存在しません。 |
1105 | 加盟店がLINE Payを利用できない状態です。 |
1106 | ヘッダー情報エラー |
1124 | 金額情報エラー(scale) |
1145 | 決済中です。 |
1172 | 同じ注文番号(orderId)で取引された履歴があります。 |
1178 | 加盟店がサポートしていない通貨です。 |
1183 | 決済金額は0より大きい必要があります。 |
1194 | 自動決済を利用できない加盟店です。 |
2101 | パラメータエラー |
2102 | JSONデータフォーマットエラー |
9000 | 内部エラー |
Request Details
Product
注文(決済)情報は、パッケージと商品別に豊富な内容で構成することができます。パッケージは配送単位のことで、一つのパッケージの中に複数の商品を入れることができます。
RedirectUrls.confirmUrl
ユーザーが決済要求を承認した後、confirmUrlを自動的に呼び出します。confirmUrlは、ユーザー承認が完了しており、Confirm APIを使用して決済完了できるということを加盟店に通知します。また、決済承認後にまだ決済完了していないユーザーに決済進行状態を案内する画面を含める必要があります。
RedirectUrls.cancelUrl
LINE Pay決済画面でユーザーが決済を途中で取り消せば、Request APIで受け取ったcancelUrlを利用して決済取り消し画面に遷移します。この際も、transactionIdとorderIdが追加された返されます。
confirmUrlType
ユーザーが決済要求を承認した後のconfirmUrlのオプション
CLIENT
決済完了のためにユーザー画面を加盟店のconfirmUrlに遷移させる。
SERVER
LINE Payサーバーから加盟店サーバーに対してconfirmUrlをリクエストする。
必ず
https
プロトコルを使用し、本番環境では"信頼できる証明書"を使用する。NONE
ユーザーが決済要求を承認した後、決済完了画面を表示する必要がない特別なケース(オフライン決済など)は、confirmUrlを使用しない。 加盟店は、Payment Status APIを使用してユーザーの決済承認の有無を定期的に照会する。
Options
Optionsのフィールドを設定することで、LINE Payが提供する多様な決済手段とLINEファミリーサービスの機能を利用できます。
Payment
決済タイプを設定します。
payType
- NORMAL
一般決済
- PREAPPROVED
自動決済
Display
ユーザーの決済画面と決済フローを設定できます。
locale
ユーザーの決済待ち画面の言語
en 英語
ja 日本語
ko 韓国語
th タイ語
zh_CN 中国語(簡体字)
zh_TW 中国語(繫体字)
Sample
一般決済
{
"amount" : 100,
"currency" : "JPY",
"orderId" : "MKSI_S_20180904_1000001",
"packages" : [
{
"id" : "1",
"amount": 100,
"products" : [
{
"id" : "PEN-B-001",
"name" : "Pen Brown",
"imageUrl" : "https://pay-store.line.com/images/pen_brown.jpg",
"quantity" : 2,
"price" : 50
}
]
}
],
"redirectUrls" : {
"confirmUrl" : "https://pay-store.line.com/order/payment/authorize",
"cancelUrl" : "https://pay-store.line.com/order/payment/cancel"
},
"options" : {
"extra" : {
"branchName" : "BRANCH_NAME",
"branchId" : "BRANCH_ID"
}
}
}
Checkout決済
{
"amount" : 1000,
"currency" : "JPY",
"orderId" : "MKSI_M_20180904_1000001",
"packages" : [
{
"id" : "1",
"amount" : 1000,
"products" : [
{
"id" : "PEN-B-001",
"name" : "Pen Brown",
"imageUrl" : "http://pay-store.line.com/static/img/brown-head.jpg",
"quantity" : 2,
"price" : 50
},
{
"id" : "NT-W-001",
"name" : "White Note",
"imageUrl" : "http://pay-store.line.com/static/img/white-head.jpg",
"quantity" : 1,
"price" : 300
},
{
"id" : "NT-P-001",
"name" : "Gun mksi-edition",
"imageUrl" : "http://pay-store.line.com/static/img/mksi-shot.jpg",
"quantity" : 2,
"price" : 300
}
]
}
],
"redirectUrls" : {
"confirmUrl" : "http://pay-store.line.com/payment/redirect?type=confirm",
"cancelUrl" : "http://pay-store.line.com/payment/redirect?type=cancel"
},
"options" : {
"shipping" : {
"type" : "SHIPPING",
"feeInquiryUrl" : "https://pay-store.line.com/order/shipping/method",
"feeInquiryType" : "CONDITION"
}
}
}
自動決済
{
"amount" : 0,
"currency" : "JPY",
"orderId" : "MKSI_P_20181231_1000001",
"packages" : [
{
"id" : "1",
"amount": 0,
"products" : [
{
"id" : "1",
"name" : "Prime MemberShip",
"imageUrl" : "https://pay-store.line.com/images/pen_brown.jpg",
"quantity" : 1,
"price" : 0
}
]
}
],
"redirectUrls" : {
"confirmUrl" : "https://pay-store.line.com/order/payment/authorize",
"cancelUrl" : "https://pay-store.line.com/order/payment/cancel"
},
"options" : {
"payment" : {
"payType" : "PREAPPROVED"
}
}
}
Confirm API
confirmUrlまたはCheck Payment Status APIによってユーザーが決済要求を承認した後、加盟店側で決済を完了させるためのAPIです。Request APIの"options.payment.capture"をfalse
に設定するとオーソリと売上確定が分離された決済になり、決済を完了させても決済ステータスは売上確定待ち(オーソリ)状態のままとなります。売上を確定するには、Capture APIを呼び出して売上確定を行う必要があります。
API Spec
POST /v3/payments/{transactionId}/confirm
- Connection Timeout : 5秒
- Read Timeout : 40秒
Request Body
Item | Data type | Length | Requirement | Description |
---|---|---|---|---|
amount | number | Y | 決済金額 | |
currency | String | 3 | Y | 決済通貨(ISO 4217) 対応通貨は以下のとおりである。
|
Response Body
Item | Data type | Length | Description |
---|---|---|---|
returnCode | String | 4 | 結果コード |
returnMessage | String | 300 | 結果メッセージ |
info.orderId | String | 100 | 決済要求時に受け取った加盟店のユニークな注文番号 |
info.transactionId | Number | 決済要求の結果として受け取った取引番号(19桁) | |
info.authorizationExpireDate | String | 30 | オーソリ満了日(ISO 8601)
|
info.regKey | String | 15 | 自動決済キー(15桁) |
info.payInfo[].method | String | 20 | 決済時に使用された決済手段
|
info.payInfo[].amount | Number | 決済金額 | |
info.payInfo[].creditCardNickname | String | 100 | 自動決済時のクレジットカードのニックネーム
|
info.payInfo[].creditCardBrand | String | 20 | 自動決済時のクレジットカードのブランド
|
info.payInfo[].maskedCreditCardNumber | String | 17 | マスキングされたクレジットカード番号(台湾加盟店に限る。加盟店 My Pageの管理者にリクエストすれば機能を使用できる) |
info.packages[].id | String | 50 | パッケージリストのユニークなID |
info.packages[].name | String | 4000 | パッケージリストの商品名 |
info.packages[].amount | Number | パッケージ内の商品金額合計=sum(products[].quantity * products[].price) |
|
info.packages[].userFeeAmount | Number | ユーザー手数料 : 決済金額の中に手数料項目が含まれている場合に返す。 | |
info.shipping.methodId | String | 50 | ユーザーが選択した配送方法のID |
info.shipping.feeAmount | Number | 送料 | |
info.shipping.address.country | String | 2 | 配送先の国 |
info.shipping.address.postalCode | String | 10 | 配送先の郵便番号 |
info.shipping.address.state | String | 100 | 配送先の都道府県 |
info.shipping.address.city | String | 100 | 配送先の市町村 |
info.shipping.address.detail | String | 1000 | 配送先の番地 |
info.shipping.address.optional | String | 1000 | 配送先の追加情報 |
info.shipping.address.recipient.firstName | String | 200 | 受取人の名前(名) |
info.shipping.address.recipient.lastName | String | 200 | 受取人の名前(姓) |
info.shipping.address.recipient.firstNameOptional | String | 200 | 受取人のカナ名(名) |
info.shipping.address.recipient.lastNameOptional | String | 200 | 受取人のカナ名(姓) |
info.shipping.address.recipient.email | String | 100 | 受取人のメールアドレス |
info.shipping.address.recipient.phoneNo | String | 50 | 受取人の電話番号 |
Return Codes
Code | Description |
---|---|
0000 | 成功 |
1101 | LINE Payのユーザーではありません。 |
1102 | ユーザーが取引できない状態です。 |
1104 | 加盟店が存在しません。 |
1105 | 加盟店がLINE Payを利用できない状態です。 |
1106 | ヘッダー情報エラー |
1110 | 使用できないクレジットカードです。 |
1124 | 金額情報エラー(scale) |
1141 | 支払い口座エラー |
1142 | 残高が不足しています。 |
1150 | 取引履歴がありません。 |
1152 | 同じtransactionIdで取引された履歴があります。 |
1153 | 決済要求した金額と実際の決済金額が異なります。 |
1159 | 決済要求情報が存在しません。 |
1169 | LINE Payで決済手段の選択とパスワード認証を行う必要があります。 |
1170 | ユーザーの口座の残高が変更されました。 |
1172 | 同じ注文番号(orderId)で取引された履歴があります。 |
1180 | 決済の有効期限が切れました。 |
1198 | APIが二重に呼び出されました。 |
1199 | 内部要求エラー |
1280 | クレジットカード決済の一時的なエラー |
1281 | クレジットカード決済エラー |
1282 | クレジットカード承認エラー |
1283 | 不正利用が疑われるため、決済が拒否されました。 |
1284 | クレジットカード決済が一時的に中断されました。 |
1285 | クレジットカードの決済情報が漏れています。 |
1286 | クレジットカードの決済情報が正しくありません。 |
1287 | クレジットカードの有効期限が切れています。 |
1288 | クレジットカードの支払い口座の残高が不足しています。 |
1289 | クレジットカードの利用限度額を超えています。 |
1290 | クレジットカードの一回当たりの利用限度額を超えています。 |
1291 | 盗難報告されたクレジットカードです。 |
1292 | 利用停止になったクレジットカードです。 |
1293 | CVN入力エラー |
1294 | ブラックリストに登録されたクレジットカードです。 |
1295 | クレジットカード番号が正しくありません。 |
1296 | 処理できない金額です。 |
1298 | クレジットカードの使用が拒否されました。 |
9000 | 内部エラー |
Sample
Confirm APIのリクエスト例
curl -X POST \
-H "Content-Type: application/json" \
-H "X-LINE-ChannelId: {your channelId}" \
-H "X-LINE-Authorization-Nonce: 44453d45-768e-40e8-8349-748e797c450f" \
-H "X-LINE-Authorization: {Hmac signature}" \
-H "X-LINE-MerchantDeviceProfileId: {your device profile id}" \
-d '{ "amount": 1000, "currency":"JPY" }' \
https://sandbox-api-pay.line.me/v3/payments/2018082512345678910/confirm
Response
決済タイプ(payType)がNORMAL(一般決済)の場合の残高決済
{
"returnCode": "0000",
"returnMessage": "OK",
"info": {
"orderId": "MKSI_M_20180904_1000001",
"transactionId": 2018082512345678910,
"payInfo": [{
"method": "BALANCE",
"amount": 900
}, {
"method": "DISCOUNT",
"amount": 100
}],
}
}
決済タイプ(payType)がPREAPPROVED(自動決済)の残高決済
{
"returnCode": "0000",
"returnMessage": "Success.",
"info": {
"orderId": "MKSI_M_20180904_1000001",
"transactionId": 2018082512345678800,
"payInfo": [{
"method": "BALANCE",
"amount": 200
}, {
"method": "DISCOUNT",
"amount": 100
}],
"regKey": "RK****************",
"packages": {
"id": "1",
"amount": 300,
"userFeeAmount": 0,
"products": [{
"id": "PEN-B-001",
"name": "Pen Brown",
"imageUrl": "https://***.com/img.img",
"quantity": 2,
"price": 150
}]
}
}
}
Capture API
Request APIを使って決済をリクエストする際に"options.payment.capture"をfalse
に設定した場合、Confirm APIで決済を完了させると決済ステータスは売上確定待ち状態になります。決済を完全に確定するためには、Capture APIを呼び出して売上確定を行う必要があります。
API Spec
POST /v3/payments/authorizations/{transactionId}/capture
- Connection Timeout : 5秒
- Read Timeout : 60秒
Request Body
Item | Data type | Requirement | Description |
---|---|---|---|
amount | number | Y | 決済金額 |
currency | String(3byte) | Y | 決済通貨(ISO 4217) 対応通貨は以下のとおりである。
|
Response Body
Item | Data type | Description |
---|---|---|
returnCode | String(4byte) | 結果コード |
returnMessage | String | 結果メッセージまたは失敗理由。例えば、以下のような場合がある。
|
info.orderId | String | 決済要求時に加盟店から受け取った注文番号 |
info.transactionId | number | 決済要求の結果として受け取った取引番号(19桁) |
info[].payInfo[].method | String | 決済時に使われた決済手段
|
info.payInfo[].amount | number | 決済金額 |
Return Codes
Code | Description |
---|---|
0000 | 成功 |
1104 | 加盟店が存在しません。 |
1105 | 加盟店がLINE Payを利用できない状態です。 |
1106 | ヘッダー情報エラー |
1150 | 取引履歴がありません。 |
1155 | 取引番号は正しくありません。 |
1170 | ユーザーの口座の残高が変更されました。 |
1172 | 同じ注文番号(orderId)で取引された履歴があります。 |
1179 | 処理できない状態です。 |
1183 | 決済金額は0より大きい必要があります。 |
1184 | 決済金額が要求時の金額を超えています。 |
1198 | APIが二重に呼び出されたか、オーソリ状態の取引を更新する途中でCapture APIが呼び出されました(数分後にもう一度お試しください)。 |
1199 | 内部要求エラー |
1280 | クレジットカード決済の一時的なエラー |
1281 | クレジットカード決済エラー |
1282 | クレジットカード承認エラー |
1283 | 不正利用が疑われるため、決済が拒否されました。 |
1284 | クレジットカード決済が一時的に中断されました。 |
1285 | クレジットカードの決済情報が漏れています。 |
1286 | クレジットカードの決済情報が正しくありません。 |
1287 | クレジットカードの有効期限が切れています。 |
1288 | クレジットカードの支払い口座の残高が不足しています。 |
1289 | クレジットカードの利用限度額を超えています。 |
1290 | クレジットカードの一回当たりの利用限度額を超えています。 |
1291 | 盗難報告されたクレジットカードです。 |
1292 | 利用停止になったクレジットカードです。 |
1293 | CVN入力エラー |
1294 | ブラックリストに登録されたクレジットカードです。 |
1295 | クレジットカード番号が正しくありません。 |
1296 | 処理できない金額です。 |
1298 | クレジットカードの使用が拒否されました。 |
9000 | 内部エラー |
Sample
リクエスト
curl -X POST \
-H "Content-Type: application/json" \
-H "X-LINE-ChannelId: {your channelId}" \
-H "X-LINE-Authorization-Nonce: c3b3c9e5-701b-4df8-bcbc-e3ee86a1cef3" \
-H "X-LINE-Authorization: {Hmac signature}" \
-H "X-LINE-MerchantDeviceProfileId: {your device profile id}" \
-d '{ "amount": 1000, "currency": "JPY" }' https://sandbox-api-pay.line.me/v3/payments/authorizations/2018082512345678910/capture
レスポンス
{
"returnCode": "0000",
"returnMessage": "OK",
"info": {
"transactionId": 20140101123123123,
"orderId": "order_210124213",
"payInfo": [{
"method": "BALANCE",
"amount": 10
}, {
"method": "DISCOUNT",
"amount": 10
}]
}
}
Void API
決済ステータスがオーソリ状態である決済データを無効化するAPIです。Confirm APIを呼び出して決済完了したオーソリ状態の取引を取り消すことができます。取り消しできるのはオーソリ状態の取引だけであり、売上確定済みの取引はRefund APIを使用して返金します。
API Spec
POST /v3/payments/authorizations/{transactionId}/void
- Connection Timeout : 5秒
- Read Timeout : 20秒
Response Body
Item | Data type | Length | Description |
---|---|---|---|
returnCode | String | 4 | 結果コード |
returnMessage | String | 300 | 結果メッセージまたは失敗理由。例えば、以下のような場合である。
|
info.refundTransactionId | number | 返金の取引番号(新規発行ー19桁) | |
info.refundTransactionDate | String | 30 | 返金日(ISO 8601) |
Return Codes
Code | Description |
---|---|
0000 | 成功 |
1101 | LINE Payのユーザーではありません。 |
1102 | ユーザーが取引できない状態です。 |
1104 | 加盟店が存在しません。 |
1105 | 加盟店がLINE Payを利用できない状態です。 |
1106 | ヘッダー情報エラー |
1150 | 取引履歴がありません。 |
1155 | 取引番号が正しくありません。 |
1165 | すでに無効化されている取引です。 |
1170 | ユーザーの口座の残高が変更されました。 |
1198 | APIが二重に呼び出されました。 |
1199 | 内部要求エラー |
1900 | 一時的なエラーです。しばらくしてからもう一度お試しください。 |
1902 | 一時的なエラーです。しばらくしてからもう一度お試しください。 |
1999 | 以前の要求情報と異なります。 |
9000 | 内部エラー |
Sample
リクエスト
curl -X POST \
-H "Content-Type: application/json" \
-H "X-LINE-ChannelId: {your channelId}" \
-H "X-LINE-Authorization-Nonce: 8335ce37-1386-4b0b-bd65-90d65abaedd6" \
-H "X-LINE-Authorization: {signature}" \
-H "X-LINE-MerchantDeviceProfileId: {your device profile id}" \
https://sandbox-api-pay.line.me/v3/payments/authorizations/2018082512345678910/void
レスポンス
{
"returnCode": "0000",
"returnMessage": "OK",
"info": {
"refundTransactionId": 2018082512345678911,
"refundTransactionDate": "2018-08-25T09:15:01Z"
}
}
Refund API
決済完了(売上確定済み)された取引を返金します。返金時は、LINE Payユーザーの決済取引番号を必ず渡す必要があります。一部返金も可能です。
API Spec
POST /v3/payments/{transactionId}/refund
- Connection Timeout : 5秒
- Read Timeout : 20秒
Request Body
Item | Data type | Requirement | Description |
---|---|---|---|
refundAmount | number | N | 返金金額
|
Response Body
Item | Data type | Length | Description |
---|---|---|---|
returnCode | String | 4 | 結果コード |
returnMessage | String | 300 | 結果メッセージまたは失敗理由 |
info.refundTransactionId | number | 返金の取引番号(新規発行ー19桁) | |
info.refundTransactionDate | String | 30 | 返金日(ISO 8601) |
Return Codes
Code | Description |
---|---|
0000 | 成功 |
1101 | LINE Payのユーザーではありません。 |
1102 | ユーザーが取引できない状態です。 |
1104 | 加盟店が存在しません。 |
1105 | 加盟店がLINE Payを利用できない状態です。 |
1106 | ヘッダー情報エラー |
1124 | 金額情報エラー(scale) |
1150 | 取引履歴がありません。 |
1155 | 返金できないタイプの取引番号です。 |
1163 | 返金可能期間が過ぎたため、返金できません。 |
1164 | 返金可能金額を超えています。 |
1165 | すでに返金が完了しています。 |
1179 | 処理できない状態です。 |
1198 | APIが二重に呼び出されました。 |
1199 | 内部要求エラー |
9000 | 内部エラー |
Sample
リクエスト
curl -X POST -H "Content-Type: application/json" \
-H "X-LINE-ChannelId: {your channelId}"\
-H "X-LINE-Authorization-Nonce: 57d03ebc-0c79-404c-82e5-bb8b3b30fe56" \
-H "X-LINE-Authorization: {Hmac signature}" \
-H "X-LINE-MerchantDeviceProfileId: {your device profile id}"\
-d '{ "refundAmount": 1000 }'\
https://sandbox-api-pay.line.me/v3/payments/2018082512345678910/refund
レスポンス
{
"returnCode": "0000",
"returnMessage": "success",
"info": {
"refundTransactionId": 2018082512345678911,
"refundTransactionDate": "2018-08-25T09:15:01Z"
}
}
Payment Details API
LINE Payの取引履歴を照会するAPIです。オーソリと売上確定の取引を照会できます。"fields"を設定することで、取引情報または注文情報を選択的に照会することができます。
API Spec
GET /v3/payments
- Connection Timeout : 5秒
- Read Timeout : 20秒
Request Parameter
Item | Data type | Requirement | Description |
---|---|---|---|
transactionId[] | number | N | LINE Payが発行した、決済または返金の取引番号 |
orderId[] | String | N | 加盟店の注文番号 |
fields | String | N | 照会対象を選択できる。 デフォルトは全件 |
Response
Response Body
共通情報
Item | Data type | Length | Description |
---|---|---|---|
returnCode | String | 4 | 結果コード |
returnMessage | String | 100 | 結果メッセージまたは失敗理由 |
Transaction
タイプで照会した場合
Item | Data type | Length | Description |
---|---|---|---|
info[].transactionId | number | 取引番号(19桁) | |
info[].transactionDate | String | 20 | 取引日(ISO-8601) |
info[].transactionType | String | 取引タイプ
|
|
info[].payStatus | String | 20 | 決済ステータス
|
info[].productName | String | 4000 | 商品名 |
info[].merchantName | String | 加盟店名 | |
info[].currency | String | 3 | 通貨(ISO 4217) |
info[].authorizationExpireDate | String | 20 | オーソリ満了日(ISO-8601) |
info[].payInfo[].method | String | 決済時に使われた決済手段
|
|
info[].payInfo[].amount | number | 取引金額(取引番号の発行時に取引された金額) 原取引を照会した際に最終取引金額を求める計算式は、以下のとおりである。 sum(info[].payInfo[].amount) 窶錀 sum(refundList[].refundAmount) |
Transaction
タイプで照会した場合ー原取引(返金取引有り)
Item | Data type | Description |
---|---|---|
info[].refundList[].refundTransactionId | number | 返金の取引番号(19桁) |
info[].refundList[].transactionType | String | 取引タイプ
|
info[].refundList[].refundAmount | number | 返金金額 |
info[].refundList[].refundTransactionDate | String | 返金日(ISO-8601) |
Transaction
タイプで照会した場合ー返金取引
Item | Data type | Description |
---|---|---|
info[].originalTransactionId | number | 原取引の取引番号(19桁) |
Order
タイプで照会した場合
Item | Data type | Length | Description | |
---|---|---|---|---|
info[].packages[].id | String | 50 | パッケージリストのユニークなID | |
info[].packages[].amount | Number | パッケージ内の商品金額合計=sum(products[].quantity * products[].price) |
||
info[].packages[].userFeeAmount | Number | ユーザー手数料 : 決済金額の中に手数料項目が含まれている場合に返す。 | ||
info[].packages[].name | String | 100 | パッケージの名前(または、加盟店内の出店業者の名前) | |
info[].packages[].products[].id | String | 50 | 加盟店の販売商品のID | |
info[].packages[].products[].name | String | 4000 | 販売商品の名前 | |
info[].packages[].products[].imageUrl | String | 500 | 販売商品の画像URL | |
info[].packages[].products[].quantity | Number | 商品数 | ||
info[].packages[].products[].price | Number | 各商品の決済金額 | ||
info[].packages[].products[].originalPrice | Number | 各商品の元の金額 | ||
info[].shipping.methodId | String | 50 | ユーザーが選択した配送方法のID | |
info[].shipping.feeAmount | Number | 送料 | ||
info[].shipping.address.country | String | 2 | 配送先の国 | |
info[].shipping.address.postalCode | String | 10 | 配送先の郵便番号 | |
info[].shipping.address.state | String | 100 | 配送先の都道府県 | |
info[].shipping.address.city | String | 100 | 配送先の市町村 | |
info[].shipping.address.detail | String | 1000 | 配送先の番地 | |
info[].shipping.address.optional | String | 1000 | 配送先の追加情報 | |
info[].shipping.address.recipient.firstName | String | 200 | 受取人の名前(名) | |
info[].shipping.address.recipient.lastName | String | 200 | 受取人の名前(姓) | |
info[].shipping.address.recipient.firstNameOptional | String | 200 | 受取人のカナ名(名) | |
info[].shipping.address.recipient.lastNameOptional | String | 200 | 受取人のカナ名(姓) | |
info[].shipping.address.recipient.email | String | 100 | 受取人のメールアドレス | |
info[].shipping.address.recipient.phoneNo | String | 50 | 受取人の電話番号 |
Return Codes
Code | Description |
---|---|
0000 | 成功 |
1104 | 加盟店が存在しません。 |
1105 | 加盟店がLINE Payを利用できない状態です。 |
1106 | ヘッダー情報エラー |
1150 | 取引履歴がありません。 |
1177 | 照会できる最大取引件数を超えています(100件)。 |
9000 | 内部エラー |
Sample
リクエスト
curl -X GET \
-H "Content-Type: application/json" \
-H "X-LINE-ChannelId: {your channelId}" \
-H "X-LINE-Authorization-Nonce: ef6934b8-b42f-48db-87b7-e18e1fb1832e" \
-H "X-LINE-Authorization: {Hmac signature}" \
-H "X-LINE-MerchantDeviceProfileId: {your device profile id}" \
https://sandbox-api-pay.line.me/v3/payments?transactionId=20140101123123123&orderId=1002045572
レスポンス
決済取引を照会した場合
{
"returnCode":"0000",
"returnMessage":"success",
"info":[{
"transactionId":2019060112345678910,
"transactionDate":"2019-06-01T09:00:00Z",
"transactionType":"PAYMENT",
"payInfo": [
{"method":"BALANCE", "amount":100},
{"method":"DISCOUNT", "amount":10}
],
"productName":"tes production",
"currency":"JPY",
"orderId":"20190601ORD45678910",
"refundList":[
{
"refundTransactionId":"2019060112345678911",
"transactionType":"PARTIAL_REFUND",
"refundAmount":-1,
"refundTransactionDate":"2019-06-06T09:00:00Z"
},
{
"refundTransactionId":"2019060112345678911",
"transactionType":"PARTIAL_REFUND",
"refundAmount":-1,
"refundTransactionDate ":"2019-06-06T10:00:00Z"
},
{
"refundTransactionId":"2019060112345678911",
"transactionType":"PARTIAL_REFUND",
"refundAmount":-1,
"refundTransactionDate ":"2019-06-06T11:00:00Z"
}
],
"packages": [
{
"id": "1",
"amount": 85,
"userFeeAmount":0
},
{
"id": "3",
"amount": 5,
"userFeeAmount":0
}
],
"shipping": {
"methodId": "FB-001",
"feeAmount": 20,
"address": {
"country": "JP",
"postalCode": "1600022",
"state": "東京都",
"city": " 渋谷区渋谷",
"detail": "(〒)150-8510 東京都 渋谷区渋谷",
"optional": "123",
"recipient": {
"firstName":"絵里",
"lastName":"松澤",
"firstNameOptional": "エリ",
"lastNameOptional": "マツザワ",
"phoneNo": "01999991234",
"email": "mksi@test.linecorp.com"
}
}
}
}]
}
返金取引を照会した場合
{
"returnCode":"0000",
"returnMessage":"success",
"info":[{
"transactionId":2019060112345678912,
"transactionDate":"2019-06-01T09:48:43Z",
"transactionType":"PARTIAL_REFUND",
"amount":-5,
"productName":"Brown",
"currency":"JPY",
"orderId":"20190101123123123",
"originalTransactionId":2019060112345678910
}]
}
Check Payment Status API
LINE Pay決済要求のステータスを照会します。confirmUrlを使用せずに加盟店側で決済ステータスを定期的にチェックし、決済完了可能かどうかを判断します。
API Spec
GET /v3/payments/requests/{transactionId}/check
- Connection Timeout : 5秒
- Read Timeout : 20秒
Response
Response Body
Item | Data type | Length | Description |
---|---|---|---|
returnCode | String | 4 | 結果コード |
returnMessage | String | 100 | 結果メッセージまたは失敗理由 |
info.shipping.methodId | String | 50 | ユーザーが選択した配送方法のID |
info.shipping.feeAmount | Number | 送料 |
Return Code
Code | Description |
---|---|
0000 | 未オーソリ |
0110 | オーソリ完了ー"Confirm API"を呼び出すことができます。 |
0121 | ユーザーによる決済取り消しまたはタイムアウト(20分)による決済取り消しーterminated状態 |
0122 | 決済失敗ーterminated状態 |
0123 | 決済完了ーterminated状態 |
1104 | 加盟店が存在しません。 |
1105 | 加盟店がLINE Payを利用できない状態です。 |
9000 | 内部エラー |
Sample
リクエスト
curl -X GET \
-H "Content-Type: application/json" \
-H "X-LINE-ChannelId: {your channelId}" \
-H "X-LINE-Authorization-Nonce: e51779e1-5788-4884-9c3a-52f7bf8cb0fa" \
-H "X-LINE-Authorization: {Hmac signature}" \
-H "X-LINE-MerchantDeviceProfileId: {your device profile id}" \
https://sandbox-api-pay.line.me/v3/payments/requests/2018110112345678910/check
レスポンス(一般決済)
{
"returnCode":"0000",
"returnMessage":"success"
}
レスポンス(Checkout決済)
{
"returnCode":"0000",
"returnMessage":"success",
"info": {
"shipping": {
"methodId": "FB-001",
"feeAmount": 20
}
}
}
Check RegKey API
発行されたRegKeyのステータスを照会します。
API Spec
GET /v3/payments/preapprovedPay/{regKey}/check
- Connection Timeout : 5秒
- Read Timeout : 20秒
Parameter
Item | Data type | Requirement | Description |
---|---|---|---|
creditCardAuth | Boolean | N | RegKeyを発行したクレジットカードの有効性チェックの有無
|
Response Body
Item | Data type | Length | Description |
---|---|---|---|
returnCode | String | 4 | 結果コード |
returnMessage | String | 300 | 結果メッセージ |
Return Codes
Code | Description |
---|---|
0000 | 成功 |
1101 | LINE Payのユーザーではありません。 |
1102 | ユーザーが取引できない状態です。 |
1104 | 加盟店が存在しません。 |
1105 | 加盟店がLINE Payを利用できない状態です。 |
1106 | ヘッダー情報エラー |
1141 | 支払い口座エラー |
1154 | 自動決済に指定した決済手段を利用できない状態です。 |
1190 | RegKeyが存在しません。 |
1193 | RegKeyが期限切れになっています。 |
Sample
Pay Preapproved APIのリクエスト例
curl -X GET \
-H "Content-Type: application/json" \
-H "X-LINE-ChannelId: {your channelId}" \
-H "X-LINE-Authorization-Nonce: df9c7e0e-e6c4-4d24-9847-b8f3cbe9bf58" \
-H "X-LINE-Authorization: {Hmac signature}" \
-H "X-LINE-MerchantDeviceProfileId: {your device profile id}" \
https://sandbox-api-pay.line.me/v3/payments/preapprovedPay/RK123asd213/check
レスポンス
{
"returnCode": "0000",
"returnMessage": "OK",
}
Pay Preapproved API
Request APIとConfirm APIを使用して予め自動決済を登録しておけば、Confirm APIで渡されたRegKeyを利用して、ユーザー承認プロセスを経ずに決済を行うことができます。
API Spec
POST /v3/payments/preapprovedPay/{regKey}/payment
- Connection Timeout : 5秒
- Read Timeout : 40秒
Request Body
Item | Data type | Length | Requirement | Description |
---|---|---|---|---|
productName | String | 4000 | Y | 商品名 |
amount | number | Y | 決済金額 | |
currency | String | 3 | Y | 決済通貨(ISO 4217) 対応通貨は以下のとおりである。
|
orderId | String | 100 | Y | 加盟店のユニークな注文番号 |
capture | Boolean | N | 売上確定の有無
|
Response Body
Item | Data type | Length | Description |
---|---|---|---|
returnCode | String | 4 | 結果コード |
returnMessage | String | 300 | 結果メッセージ |
info.transactionId | Number | 決済要求の結果として受け取った取引番号(19桁) | |
info.transactionDate | String | 30 | 取引日(ISO 8601) |
info.authorizationExpireDate | String | 30 | オーソリ満了日(ISO 8601) |
Return Codes
Code | Description |
---|---|
0000 | 成功 |
1101 | LINE Payのユーザーではありません。 |
1102 | ユーザーが取引できない状態です。 |
1104 | 加盟店が存在しません。 |
1105 | 加盟店がLINE Payを利用できない状態です。 |
1106 | ヘッダー情報エラー |
1110 | 使用できないクレジットカードです。 |
1124 | 金額情報エラー(scale) |
1141 | 支払い口座エラー |
1142 | 残高が不足しています。 |
1150 | 取引履歴がありません。 |
1152 | 同じtransactionIdで取引された履歴があります。 |
1153 | 決済要求した金額と実際の決済金額が異なります。 |
1159 | 決済要求情報が存在しません。 |
1169 | LINE Payで決済手段の選択とパスワード認証を行う必要があります。 |
1170 | ユーザーの口座の残高が変更されました。 |
1172 | 同じ注文番号(orderId)で取引された履歴があります。 |
1180 | 決済の有効期限が切れました。 |
1190 | RegKeyが存在しません。 |
1193 | RegKeyが有効期限になっています。 |
1194 | 自動決済を利用できない加盟店です。 |
1197 | RegKeyで決済中です。 |
1198 | APIが二重に呼び出されました。 |
1199 | 内部要求エラー |
1280 | クレジットカード決済の一時的なエラー |
1281 | クレジットカード決済エラー |
1282 | クレジットカード承認エラー |
1283 | 不正利用が疑われるため、決済が拒否されました。 |
1284 | クレジットカード決済が一時的に中断されました。 |
1285 | クレジットカードの決済情報が漏れています。 |
1286 | クレジットカードの決済情報が正しくありません。 |
1287 | クレジットカードの有効期限が切れています。 |
1288 | クレジットカードの支払い口座の残高が不足しています。 |
1289 | クレジットカードの利用限度額を超えています。 |
1290 | クレジットカードの一回当たりの利用限度額を超えています。 |
1291 | 盗難報告されたクレジットカードです。 |
1292 | 利用停止になったクレジットカードです。 |
1293 | CVN入力エラー |
1294 | ブラックリストに登録されたクレジットカードです。 |
1295 | クレジットカード番号が正しくありません。 |
1296 | 処理できない金額です。 |
1298 | クレジットカードの使用が拒否されました。 |
9000 | 内部エラー |
Sample
Pay Preapproved APIのリクエスト例
curl -X POST \
-H "Content-Type: application/json" \
-H "X-LINE-ChannelId: {your channelId}" \
-H "X-LINE-Authorize-Nonce: 6120489b-53f3-4c51-9d6f-b80be93e509a"\
-H "X-LINE-Authorization: {hmac signature}" \
-H "X-LINE-MerchantDeviceProfileId: {your device profile id}" \
-d '{ "productName":"Brown pen", "amount": 1000, "currency":"JPY", "orderId":"Ord2018123100000001" }' \
https://sandbox-api-pay.line.me/v3/payments/preapprovedPay/RK123asd213/payment
レスポンス
capture : true のレスポンス例
{
"returnCode": "0000",
"returnMessage": "OK",
"info": {
"transactionId": 2018123112345678910,
"transactionDate": "2018-12-31T09:00:31Z"
}
}
capture : false のレスポンス例
{
"returnCode": "0000",
"returnMessage": "OK",
"info": {
"transactionId": 2018123112345678910,
"transactionDate": "2018-12-31T09:00:31Z",
"authorizationExpireDate": "2019-01-31T09:00:31Z",
}
}
Expire RegKey API
発行されたRegKeyを満了させます。
API Spec
POST /v3/payments/preapprovedPay/{regKey}/expire
- Connection Timeout : 5秒
- Read Timeout : 20秒
Response Body
Item | Data type | Length | Description |
---|---|---|---|
returnCode | String | 4 | 結果コード |
returnMessage | String | 300 | 結果メッセージ |
Return Codes
Code | Description |
---|---|
0000 | 成功 |
1104 | 加盟店が存在しません。 |
1105 | 加盟店がLINE Payを利用できない状態です。 |
1106 | ヘッダー情報エラー |
1190 | RegKeyが存在しません。 |
1193 | RegKeyが期限切れになっています。 |
Sample
Pay Preapproved APIのリクエスト例
curl -X POST \
-H "Content-Type: application/json" \
-H "X-LINE-ChannelId: {your channelId}" \
-H "X-LINE-Authorization-Nonce: 5c75efcc-9c5e-4a32-9fe3-5d55ce67b598" \
-H "X-LINE-Authorization: {Hmac signature}" \
-H "X-LINE-MerchantDeviceProfileId: {your device profile id}" \
https://sandbox-api-pay.line.me/v3/payments/preapprovedPay/RK123asd213/expire
44453d45-768e-40e8-8349-748e797c450f
レスポンス
{
"returnCode": "0000",
"returnMessage": "OK",
}
Merchant provided API or Page
Merchant provided API or Page
加盟店からLINE Pay側に提供すべきAPI(またはページURL)について記述します。本番環境では、必ず信頼できる証明書とHTTPSプロトコルを使用してください。また、セキュリティ上、証明書はTLS 1.2以上のバージョンを使用します。
Access Control List
加盟店が提供するAPIがIPアドレスによるアクセス制御を使用している場合は、以下の各環境ごとにLINE Pay Server IPを登録してください。
- Sandbox : 147.92.159.209, 147.92.159.21, 147.92.159.68
- Real : 211.249.40.1~211.249.40.30, 147.92.220.5~147.92.220.8
confirmUrl Spec
加盟店は、confirmUrlTypeによって画面またはAPIの形でconfirmUrlを提供する必要があります。LINE Payでユーザーが決済を承認すれば、その旨を加盟店に通知し、confirmUrlを利用して加盟店の決済進行画面をユーザーに表示します。また、confirmUrlは、Confirm APIを呼び出して決済を完了して後、決済完了画面に遷移する機能も提供します。ただ、ユーザーに画面を表示する必要がない特別なケース(オフライン決済など)は、HTTPステータスコード200を返してください。
API明細
Item | Description |
---|---|
Protocol | HTTP |
Method | GET |
Request timeout | Connection: 5秒 Read: 20秒 |
Request Parameters
Parameter | Requirement | Description |
---|---|---|
orderId | Y | 決済要求時に加盟店から受け取った注文番号 |
transactionId | Y | 決済要求の結果として受け取った取引番号 |
shippingFeeAmount | N | Checkoutの送料 |
shippingMethodId | N | 加盟店の配送方法の中で選択された配送方法のID |
加盟店からはレスポンスとして別途の情報を返さず、LINE Pay側はHTTPステータスコードで成功かどうかを判断します。成功(200 OK)以外のHTTPステータスコードが返された場合は、ユーザーに決済が正常に完了されなかったことを通知します。
Response
Sample
リクエスト 加盟店から受け取ったconfirmUrlが'http://testmall.com/pay/result'と仮定した場合
curl -X GET \
http://testmall.com/pay/result?orderId=2018xxx1232132&trasactionId=201810281234567890&shippingFeeAmount=2100&shippingMethodId=1
成功時のレスポンス
HTTP/1.1 200 OK
Accept-Charset: utf-8
Content-Type: text/html
Content-Length: 2
Date: Sat, 11 Oct 2018 02:45:48 GMT
失敗時のレスポンス
HTTP/1.1 404 NOT_FOUND
Accept-Charset:utf-8
Content-Type:text/html
Content-Length:4
Date:Sat, 11 Oct 2018 02:45:48 GMT
cancelUrl
ユーザーがLINE Pay決済画面で決済を途中で取り消せば、Request APIで受け取ったcancelUrlを利用して加盟店の決済取り消し画面に遷移します。cancelUrlのクエリ文字列にtransactionId
、orderId
が含まれていない場合は、自動的に追加されて返されます。
Inquiry ShippingMethods API
Checkoutを利用する加盟店は、Inquiry ShippingMethods APIを実装し、Request APIを使用してLINE Pay側に提供する必要があります。ユーザーが配送先を選択すると、同APIを呼び出して、Postal Code(ZipCode)を基に配送可否と配送可能方法、送料を照会します。ユーザーが選択した配送方法と送料は、confirmUrlを利用して加盟店側に提供されます。
API明細
Item | Description |
---|---|
Protocol | HTTP |
Method | POST |
Request timeout | Connection: 5秒 Read: 20秒 |
Request
- HTTP Header
Key | Value | Description |
---|---|---|
Content-Type | application/json |
- Body
Parameter | Data type | Length | Requirement | Description |
---|---|---|---|---|
currency | String | 3 | Y | 送料の通貨 |
orderId | String | 100 | Y | 決済要求時に加盟店から受け取った注文番号 |
transactionId | Number | Y | 決済要求の結果として受け取った取引番号 | |
shippingAddress.country | String | 2 | N | 配送先の国 |
shippingAddress.postalCode | String | 10 | N | 配送先の郵便番号 |
shippingAddress.state | String | 100 | N | 配送先の都道府県 |
shippingAddress.city | String | 300 | N | 配送先の市町村 |
Response Body
Parameter | Data type | Length | Requirement | Description |
---|---|---|---|---|
returnCode | String | 3 | Y | 結果コード |
returnMessage | String | 100 | N | 結果メッセージ |
info.shippingMethods[].id | String | Y | 加盟店の配送方法のID | |
info.shippingMethods[].name | String | 100 | Y | 配送方法の名前 |
info.shippingMethods[].amount | Number | Y | 送料 | |
info.shippingMethods[].toDeliveryYmd | String | 8 | N | 配送予定日(YYYYMMDD) |
info.shippingMethods[].fromDeliveryHm | String | 4 | N | 配送予定期間の開始時間(HHmm) |
info.shippingMethods[].toDeliveryHm | String | 4 | N | 配送予定期間の終了時間(HHmm) |
Return Codes
Code | Description |
---|---|
0000 | 成功 |
4001 | 配送できない地域です。 |
4002 | 配送先が正しくありません。 |
5001 | 内部サーバーエラー(不明なエラー) |
9999 | システムメンテナンス中 |
Sample
レスポンス
配送時刻が指定されていない場合(配送予定日のみ存在)
{
"returnCode": "0000",
"returnMessage": "OK",
"info": {
"shippingMethods":[
{
"id": "1",
"name": "FAST POST",
"amount": 500,
"toDeliveryYmd": "20181030"
}
]
}
}
ユーザーメッセージの例
FAST POST - 500
2018/10/30 時間の指定なし
配送予定日と配送予定期間の開始時間・終了時間がすべて存在する場合
{
"returnCode": "0000",
"returnMessage": "OK",
"info": {
"shippingMethods":[
{
"id": "1",
"name": "FAST POST",
"amount": 500,
"toDeliveryYmd": "20181030",
"fromDeliveryHm": "1000",
"toDeliveryHm": "1200",
}
]
}
}
ユーザーメッセージの例
FAST POST - 500
2018/10/30 10:00 ~ 12:00
Appendix
LINE Payのエラーコード
LINE Payで発生するエラーコードを定義します。エラーコードとともに英語のエラーメッセージを表示し、既定のメッセージがない場合はハイフン(‐)を返します。
Code | Description |
---|---|
1101 | LINE Payのユーザーではありません。 |
1102 | ユーザーが取引できない状態です。 |
1104 | 加盟店が存在しません。 |
1105 | 加盟店がLINE Payを利用できない状態です。 |
1106 | ヘッダー情報エラー |
1110 | 使用できないクレジットカードです。 |
1124 | 金額情報エラー(scale) |
1141 | 支払い口座エラー |
1142 | 残高が不足しています。 |
1145 | 決済中です。 |
1150 | 取引履歴がありません。 |
1152 | 同じtransactionIdで取引された履歴があります。 |
1153 | 決済要求した金額と実際の決済金額が異なります。 |
1154 | 自動決済に指定した決済手段を利用できない状態です。 |
1155 | 返金できないタイプの取引番号です。 |
1159 | 決済要求情報が存在しません。 |
1163 | 返金可能期間が過ぎたため、返金できません。 |
1164 | 返金可能金額を超えています。 |
1165 | すでに返金が完了しています。 |
1169 | 決済承認のための情報にエラーがあります(LINE Payで決済手段の選択とパスワード認証を行う必要があります)。 |
1170 | ユーザーの口座の残高が変更されました。 |
1172 | 同じ注文番号(orderId)で取引された履歴があります。 |
1177 | 照会できる最大取引件数を超えています(100件)。 |
1178 | 加盟店がサポートしていない通貨です。 |
1179 | 処理できない状態です。 |
1180 | 決済の有効期限が切れました。 |
1183 | 決済金額は0より大きい必要があります。 |
1184 | 決済金額が要求時の金額を超えています。 |
1190 | RegKeyが存在しません。 |
1193 | RegKeyが期限切れになっています。 |
1194 | 自動決済を利用できない加盟店です。 |
1197 | RegKeyで決済中です。 |
1198 | リクエスト処理中です。 |
1199 | 内部要求エラー |
1279 | クレジットカード決済の一時的なエラー |
1280 | クレジットカード決済の一時的なエラー |
1281 | クレジットカード決済エラー |
1282 | クレジットカード承認エラー |
1283 | 不正利用が疑われるため、決済が拒否されました。 |
1284 | クレジットカード決済が一時的に中断されました。 |
1285 | クレジットカードの決済情報が漏れています。 |
1286 | クレジットカードの決済情報が正しくありません。 |
1287 | クレジットカードの有効期限が切れています。 |
1288 | クレジットカードの支払い口座の残高が不足しています。 |
1289 | クレジットカードの利用限度額を超えています。 |
1290 | クレジットカードの一回当たりの利用限度額を超えています。 |
1291 | 盗難報告されたクレジットカードです。 |
1292 | 利用停止になったクレジットカードです。 |
1293 | CVN入力エラー |
1294 | ブラックリストに登録されたクレジットカードです。 |
1295 | クレジットカード番号が正しくありません。 |
1296 | 処理できない金額です。 |
1298 | クレジットカードの使用が拒否されました。 |
2101 | パラメータエラー |
2102 | JSONデータフォーマットエラー |
9000 | 内部エラー |
9001 | 内部エラー |
LINE App Transition Guide
このガイドは、LINE Pay加盟店にて商品等の販売をおこなうサイトやアプリなどからLINEアプリに遷移する挙動を記載したものです。
Android Sample
以下のサンプルコードを利用して、LINEアプリのインストール有無と使用できるLINE Payのバージョンを確認できます。LINEアプリがインストールされており、使用可能なLINE Payのバージョンが確認されたら、LINE Payの決済画面に遷移します。
Android
int linePaySupportedVersion = 230;
String paymentUrl = "..."; // This is "paymentUrl.app" URL String.
Context context = getActivity();
try {
PackageManager pm = context.getPackageManager();
PackageInfo packageInfo = pm.getPackageInfo("jp.naver.line.android", 0);
int versionCode = packageInfo.versionCode;
if (linePaySupportedVersion <= versionCode) {
launchUri(paymentUrl);
} else {
confirmLineInstall(context);
}
} catch (NameNotFoundException e) {
confirmLineInstall(context);
}
private void confirmLineInstall(Context context) {
new AlertDialog.Builder(context)
.setTitle("LINE Pay")
.setMessage(getString(R.String.linepay_confirm))
.setCancelable(false)
.setPositiveButton(getString(R.String.linepay_install), new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
launchUri("market://details?id=jp.naver.line.android");
}
})
.setNegativeButton(getString(R.String.linepay_cancel), new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.show();
}
private void launchUri(String uriString) {
Uri uri = Uri.parse(uriString);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
File : res/values/Strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
...
<String name="linepay_confirm">Supported by Android/iPhone LINE versions 4.8.0
or higher.</String>
<String name="linepay_install">Get it now</String>
<String name="linepay_cancel">cancel</String>
...
</resources>
iPhone Sample
以下のサンプルコードを利用して、LINEアプリのインストール有無を確認できます。LINEアプリがインストールされていれば、LINE Payの決済画面に遷移します。
iOS
NSString* lineScheme = @"line://";
BOOL installed = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:lineScheme]];
if (installed) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"LINE Pay"
message:NSLocalizedString(@"linepay.confirm", nil)
delegate:self
cancelButtonTitle:NSLocalizedString(@"linepay.ok", nil) otherButtonTitles:nil];
alert.tag = 1;
[alert show];
} else {
UIAlertView *alert =
[[UIAlertView alloc] initWithTitle:@"LINE Pay"
message:NSLocalizedString(@"linepay.confirm", nil)
delegate:self
cancelButtonTitle:NSLocalizedString(@"linepay.cancel", nil)
otherButtonTitles:NSLocalizedString(@"linepay.install",
nil), nil];
alert.tag = 2;
[alert show];
}
- (void)alertView:(UIAlertView*)alertView
clickedButtonAtIndex:(NSInteger)buttonIndex {
if (alertView.tag == 1 && buttonIndex == 0) {
NSString *paymentUrl = ...; // This is "paymentUrl.app" URL String.
[self launchUrl:paymentUrl];
} else if (alertView.tag == 2 && buttonIndex == 1) {
[self launchUrl:@"itmsapps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=443904275&mt=8"];
}
}
- (void)launchUrl:(NSString*)urlString {
NSURL *url = [NSURL URLWithString:urlString];
[[UIApplication sharedApplication] openURL:url];
}
File : en.lproj/Localized.Strings
"linepay.confirm" = "Supported by Android/iPhone LINE versions 4.8.0 or higher.";
"linepay.ok" = "OK";
"linepay.cancel" = "Cancel";
"linepay.install" = "Get it now";
Sandbox
Sandboxの使用
LINE Payでは、Sandbox環境を提供しています。Sandboxでテストを行う場合、この連携ガイドが提供するAPI明細に記載されたSandbox用EndPointを利用して決済してください。confirmUrlとInquiry ShippingMethods APIを加盟店側で用意する必要があります。 Sandbox環境で決済を行えば、以下のように処理されます。
Sandbox PC Payment
Sandbox Mobile Payment
特記事項
Sandbox環境では、PC・スマートフォンともにチャネルログインが求められます(ただ、スマートフォンを利用して本番環境で連携するとLINEアプリに直接遷移されるので、チャネルログインは不要です)。
Migration API V3
Payment API v2からv3への移行により、API認証がHMAC署名検証に変わり、Request APIがv3にアップデートされます。
Authentication
Payment API v2ではIDとパスワードによる認証方法を使用していましたが、v3ではHMACを利用して認証とメッセージ検証を行う方法に変わります。
v2でパスワードとして渡していたX-LINE-ChannelSecret
は、加盟店側で保存してください。HMAC署名を作成するときは、SecretKeyを使用します。
X-LINE-Authorization-Nonce
にランダムで生成される値を指定することで、署名のセキュリティを強化できます。
詳細は、API Authenticationをご参照ください。
HTTP Request Headers
Header | Version 2 | Version 3 | Description |
---|---|---|---|
X-LINE-ChannelId | O | O | 変更なし |
X-LINE-ChannelSecret | O | X | 削除 |
X-LINE-MerchantDeviceProfileId | O | O | 変更なし |
X-LINE-Authorization-Nonce | X | O | 新規 |
X-LINE-Authorization | X | O | 新規 |
Request API
Request API v3の一番大きな変更点は、豊富な商品と注文情報をユーザーに提供するとともに、LINEユーザー情報を利用して簡単かつ便利にCheckout機能を提供できるという点です。
v2では単一商品に定義されていたproductName
とproductImageUrl
を、v3ではpackage[]
構造に切り替えます。これにより、ユーザーに各商品の詳細な決済情報を提供することができます。
options.shipping
は、Checkout用として定義されたものです。
詳細は、Request APIをご参照ください。
Request Body Mapping
Version 2 | Version 3 | Description |
---|---|---|
amount | amount | 変更なし |
currency | currency | 変更なし |
orderId | orderId | 変更なし |
packages[].id | 新規 | |
packages[].amount | 新規 | |
packages[].userFee | 新規 | |
packages[].name | 新規 | |
packages[].products[].id | 単一商品 → 複数商品 | |
productName | packages[].products[].name | 単一商品 → 複数商品 |
productImageUrl | packages[].products[].imageUrl | 単一商品 → 複数商品 |
packages[].products[].quantity | 新規 | |
packages[].products[].price | 新規 | |
packages[].products[].originalPrice | 新規 | |
packageName | redirectUrls.appPackageName | 名称変更 |
confirmUrl | redirectUrls.confirmUrl | |
confirmUrlType | redirectUrls.confirmUrlType | |
cancelUrl | redirectUrls.cancelUrl | |
capture | options.payment.capture | |
payType | options.payment.payType | |
langCd | options.display.locale | 名称変更 |
checkConfirmUrlBrowser | options.display.checkConfirmUrlBrowser | |
extras.addFriends[].type | options.familyService.addFriends[].type | |
extras.addFriends[].idList[] | options.familyService.addFriends[].idList[] | |
options.shipping.* | 新規 |