
PayPal 請求書 生成 (JPY)
設定項目の情報から Paypal 請求書が自動生成し、Paypal Invoice ID を文字列型データ項目に格納します
2018 © Questetra, Inc. (MIT License)
https://support.questetra.com/ja/addons/paypal-createjpy/
Configs
- A: PayPal-REST-API の Client ID と SECRET を2行に分けてセットしてください *
- B: 通信ログが格納される文字列型データを選択してください (更新)
- C: 販売人の商号/国コード(“JP”)/郵便番号/都道府県/市区町村を5行に分けてセットしてください *
- D: 販売人の住所を2行に分けてセットしてください *
- E: 販売人の国際電話国番号(“81”)/電話番号/メールアドレス/URLを4行に分けてセットしてください *
- F: 請求先の商号が格納されている文字列型データを選択してください *
- G: 請求先の名前1(姓・部署)が格納されている文字列型データを選択してください *
- H: 請求先の名前2(名・氏名)が格納されている文字列型データを選択してください *
- I: 請求先のメールアドレスが格納されている文字列型データを選択してください *
- J: 商品名が格納されている文字列型データを選択してください *
- K: 商品説明が格納されている文字列型データを選択してください *
- L: 商品数量が格納されている数値型データを選択してください *
- M: 商品単価が格納されている数値型データを選択してください *
- N: 税率をセットしてください (例: “8” “10”) *
- O: 請求書IDが格納されている文字列型データを選択してください *
- P: 支払期日が格納されている日付型データを選択してください *
- Q: 請求書の備考文が格納されている文字列型データを選択してください *
- R: 請求書の契約条件文が格納されている文字列型データを選択してください *
- S: ロゴ画像のURLをセットしてください (例: “https://example.com/a.png”) *
- T: Paypal Invoce ID が格納される文字列型データを選択してください (更新) *
Script
//// == 工程コンフィグの参照 / Config Retrieving ==
var clientId_secret = configs.get( "conf_ClientId_Secret" ) + "";
var array_clientId_secret = clientId_secret.split("\n");
var clientId = array_clientId_secret[0];
var secret = array_clientId_secret[1];
var merchantPostalCode = configs.get( "conf_MerchantPostalCode" ) + "";
var array_merchantPostalCode = merchantPostalCode.split("\n");
var merchantBusinessName = array_merchantPostalCode[0];
var merchantAddressCC = array_merchantPostalCode[1];
var merchantAddressPC = array_merchantPostalCode[2];
var merchantAddressState = array_merchantPostalCode[3];
var merchantAddressCity = array_merchantPostalCode[4];
var merchantAddress = configs.get( "conf_MerchantAddress" ) + "";
var array_merchantAddress = merchantAddress.split("\n");
var merchantAddress1 = array_merchantAddress[0];
var merchantAddress2 = array_merchantAddress[1];
var merchantPhoneEmail = configs.get( "conf_MerchantPhoneEmail" ) + "";
var array_merchantPhoneEmail = merchantPhoneEmail.split("\n");
var merchantPhoneCC = array_merchantPhoneEmail[0];
var merchantPhoneNum = array_merchantPhoneEmail[1];
var merchantEmail = array_merchantPhoneEmail[2];
var merchantWebsite = array_merchantPhoneEmail[3];
var billingLanguage = "ja_JP"; /// HARD-CODED
var itemUnitPriceCurrency = "JPY"; /// HARD-CODED
var itemTaxName = "TAX"; /// HARD-CODED
var itemTaxPercent = configs.get( "conf_ItemTax" ) - 0;
var logoUrl = configs.get( "conf_logoUrl" ) + "";
var dataIdB = configs.get( "conf_DataIdB" ) + "";
var dataIdF = configs.get( "conf_DataIdF" ) + "";
var dataIdG = configs.get( "conf_DataIdG" ) + "";
var dataIdH = configs.get( "conf_DataIdH" ) + "";
var dataIdI = configs.get( "conf_DataIdI" ) + "";
var dataIdJ = configs.get( "conf_DataIdJ" ) + "";
var dataIdK = configs.get( "conf_DataIdK" ) + "";
var dataIdL = configs.get( "conf_DataIdL" ) + "";
var dataIdM = configs.get( "conf_DataIdM" ) + "";
var dataIdO = configs.get( "conf_DataIdO" ) + "";
var dataIdP = configs.get( "conf_DataIdP" ) + "";
var dataIdQ = configs.get( "conf_DataIdQ" ) + "";
var dataIdR = configs.get( "conf_DataIdR" ) + "";
var dataIdT = configs.get( "conf_DataIdT" ) + "";
//// == ワークフローデータの参照 / Data Retrieving ==
var billingBusinessName = engine.findDataByNumber( dataIdF ) + ""; // Max 100
var billingName1 = engine.findDataByNumber( dataIdG ) + ""; // Max 30
var billingName2 = engine.findDataByNumber( dataIdH ) + ""; // Max 30
var billingEmail = engine.findDataByNumber( dataIdI ) + ""; // Max 260
var itemName = engine.findDataByNumber( dataIdJ ) + ""; // Max 200
var itemDescription = engine.findDataByNumber( dataIdK ) + ""; // Max 1000
var itemQuantity = engine.findDataByNumber( dataIdL ) - 0;
var itemUnitPriceNum = engine.findDataByNumber( dataIdM ) - 0;
var itemUnitPrice = Math.floor( itemUnitPriceNum ) + ""; // STRING!! without Comma
// Currency JPY does not support decimals. If you pass a decimal amount, an error occurs.
var invoiceNumber = engine.findDataByNumber( dataIdO ) + ""; // Max 25
var paymentTermDueDate = engine.findDataByNumber( dataIdP ) + " PST";
var invoiceNote = engine.findDataByNumber( dataIdQ ) + ""; // Max 4000
var invoiceTerms = engine.findDataByNumber( dataIdR ) + ""; // Max 4000
var merchantMemo = "BPMS Process ID: " + processInstance.getProcessInstanceId();
//// == 演算 / Calculating ==
var accessLog = "";
// Get OAuth Token with Client Credentials
var uri = "https://api.paypal.com/v1/oauth2/token";
var response = httpClient.begin()
.basic( clientId, secret )
.formParam( "grant_type", "client_credentials" )
.post( uri );
var httpStatus = response.getStatusCode() + "";
accessLog = "---POST request--- " + httpStatus + "\n";
accessLog += response.getResponseAsString() + "\n";
// Error Handling
if( httpStatus !== "200" ){
throw new Error( accessLog );
}
var oauthTokenObj = JSON.parse( response.getResponseAsString() );
var oauthToken = oauthTokenObj.access_token;
// Create invoice
var invoiceObj = {};
invoiceObj.number = invoiceNumber;
invoiceObj.payment_term = {};
invoiceObj.payment_term.due_date = paymentTermDueDate;
invoiceObj.note = invoiceNote;
invoiceObj.terms = invoiceTerms;
invoiceObj.logo_url = logoUrl;
invoiceObj.merchant_memo = merchantMemo;
invoiceObj.merchant_info = {};
invoiceObj.merchant_info.email = merchantEmail;
invoiceObj.merchant_info.business_name = merchantBusinessName;
invoiceObj.merchant_info.address = {};
invoiceObj.merchant_info.address.line1 = merchantAddress1;
invoiceObj.merchant_info.address.line2 = merchantAddress2;
invoiceObj.merchant_info.address.city = merchantAddressCity;
invoiceObj.merchant_info.address.state = merchantAddressState;
invoiceObj.merchant_info.address.postal_code = merchantAddressPC;
invoiceObj.merchant_info.address.country_code = merchantAddressCC;
invoiceObj.merchant_info.address.phone = {};
invoiceObj.merchant_info.address.phone.country_code = merchantPhoneCC;
invoiceObj.merchant_info.address.phone.national_number = merchantPhoneNum;
invoiceObj.merchant_info.website = merchantWebsite;
invoiceObj.billing_info = [];
invoiceObj.billing_info[0] = {};
invoiceObj.billing_info[0].email = billingEmail;
invoiceObj.billing_info[0].first_name = billingName1;
invoiceObj.billing_info[0].last_name = billingName2;
invoiceObj.billing_info[0].business_name = billingBusinessName;
invoiceObj.billing_info[0].language = billingLanguage;
invoiceObj.items = [];
invoiceObj.items[0] = {};
invoiceObj.items[0].name = itemName;
invoiceObj.items[0].description =itemDescription;
invoiceObj.items[0].quantity = itemQuantity;
invoiceObj.items[0].unit_price = {};
invoiceObj.items[0].unit_price.currency = itemUnitPriceCurrency;
invoiceObj.items[0].unit_price.value = itemUnitPrice;
if( itemTaxPercent !== 0 ){
invoiceObj.items[0].tax = {};
invoiceObj.items[0].tax.name = itemTaxName;
invoiceObj.items[0].tax.percent = itemTaxPercent;
}
var uriCreate = "https://api.paypal.com/v1/invoicing/invoices/";
var responseCreate = httpClient.begin()
.bearer( oauthToken )
.body( JSON.stringify( invoiceObj ), "application/json" )
.post( uriCreate );
var httpStatusCreate = responseCreate.getStatusCode() + "";
accessLog = "---POST request--- " + httpStatusCreate + "\n";
accessLog += responseCreate.getResponseAsString() + "\n";
// Error Handling
if( httpStatusCreate !== "201" ){
throw new Error( accessLog );
}
var paypalIdObj = JSON.parse( responseCreate.getResponseAsString() );
var paypalId = paypalIdObj.id;
//// == ワークフローデータへの代入 / Data Updating ==
engine.setDataByNumber( dataIdT, paypalId );
if ( dataIdB !== "" ){ engine.setDataByNumber( dataIdB, accessLog ); }
Download
- Paypal-createJpy.xml
- スクリプトエンジンとして「Rhino(廃止予定)」が指定されているため、アプリにインストールしても設定エラーとなります
- 利用するには、スクリプトエンジンの変更、およびそれに伴うスクリプト修正が必要です
- 対応方法は、「スクリプトエンジン Rhino 廃止のお知らせ」を参考にしてください
- 修正版は準備中です
Capture

Notes
- 事前に Paypal Dashboard にて App を生成し、Client ID/Secret を取得しておく必要があります
See also
- 2017-07-03 第542話:PayPal Invoice 連携で、ラクラク請求業務(3)
- 2017-06-26 第541話:PayPal Invoice 連携で、ラクラク請求業務(2)
- 2017-06-19 第540話:PayPal Invoice 連携で、ラクラク請求業務(1)
