Created
March 16, 2012 02:47
-
-
Save Fandora/2048208 to your computer and use it in GitHub Desktop.
node.js + paypal express checkout
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var Request = require("request"); | |
// USER: API 用戶名稱 | |
// PWD: API 密碼 | |
// SIGNATURE: 簽名 | |
/* METHOD: SetExpressCheckout | |
RETURNURL:當於PayPal 網站完成明細確認後,瀏覽器將帶顧客返回至此網址。 | |
CANCELURL:當顧客選擇終止付款時,瀏覽器將帶顧客返回至此網址。 | |
AMT:交易金額。基本格式為 00.00 */ | |
var _USER = ""; | |
var _PWD = ""; | |
var _SIG = ""; | |
/* | |
* options所需的參數 | |
* name 商品名稱 | |
* number 商品編號 | |
* desc 商品描述 | |
* amt 單價 | |
* qty 數量 | |
* shippingamt 運費 | |
* returnurl 回傳網值 就是paypal認證成功後 導向自己的交易處理頁 | |
* cancelurl 取消網址 | |
* | |
* 產生交易token | |
*/ | |
module.exports.setExpressCheckout = function(options, next) { | |
var body = { | |
L_PAYMENTREQUEST_0_NAME0 : options.name | |
, L_PAYMENTREQUEST_0_NUMBER0 : options.number | |
, L_PAYMENTREQUEST_0_DESC0 : options.desc | |
, L_PAYMENTREQUEST_0_AMT0 : options.amt | |
, L_PAYMENTREQUEST_0_QTY0 : options.qty | |
// , SHIPPINGAMT : options.shippingamt | |
, PAYMENTREQUEST_0_ITEMAMT : options.amt * options.qty | |
// , AMT : options.amt * options.qty + options.shippingamt | |
, PAYMENTREQUEST_0_AMT : options.amt * options.qty | |
, PAYMENTREQUEST_0_CURRENCYCODE : "TWD" | |
, PAYMENTREQUEST_0_PAYMENTACTION : "Sale" | |
, RETURNURL : options.returnurl | |
, CANCELURL : options.cancelurl | |
, METHOD : "SetExpressCheckout" | |
, USER : _USER | |
, PWD : _PWD | |
, SIGNATURE : _SIG | |
, VERSION : "63.0" | |
, ALLOWNOTE : "1" | |
, LOCALECODE : "zh_TW" | |
, LANDINGPAGE : "Billing" | |
, EMAIL : options.email | |
}; | |
console.log(body); | |
if(options.brandname) body.BRANDNAME = options.brandname; | |
Request.post({ | |
url : "https://api-3t.paypal.com/nvp" | |
, form : body | |
}, function(err, response, body) { | |
body = decodeURIComponent(body); | |
console.log(body); | |
if(err) { | |
next(err); | |
} else if (response.statusCode != 200) { | |
next(new Error(body)); | |
} else { | |
var arr = body.split("&"); | |
var obj = {}; | |
for(var i in arr) { | |
var tmp = arr[i].split("="); | |
obj[tmp[0]] = tmp[1]; | |
} | |
next(null, obj["TOKEN"]); | |
} | |
}); | |
}; | |
/* | |
* 都使用者認證後 | |
* 就可以開始處理交易 | |
* 首先由token取得交易資料 | |
*/ | |
module.exports.getExpressCheckoutDetails = function(token, next) { | |
var body = { | |
TOKEN : token | |
, METHOD : "GetExpressCheckoutDetails" | |
, USER : _USER | |
, PWD : _PWD | |
, SIGNATURE : _SIG | |
, VERSION : "63.0" | |
}; | |
console.log(body); | |
Request.post({ | |
url : "https://api-3t.paypal.com/nvp" | |
, form : body | |
}, function(err, response, body){ | |
body = decodeURIComponent(body); | |
console.log(body); | |
if(err) { | |
next(err); | |
} else if (response.statusCode != 200) { | |
next(new Error(body)); | |
} else { | |
var arr = body.split("&"); | |
var data = {}; | |
for(var i in arr) { | |
var tmp = arr[i].split("="); | |
data[tmp[0].toLowerCase()] = tmp[1]; | |
} | |
next(null, data); | |
} | |
}); | |
}; | |
/** | |
* 實際扣款! | |
*/ | |
module.exports.doExpressCheckoutPayment = function(token, amt, payerid, next) { | |
var body = { | |
TOKEN : token | |
, METHOD : "DoExpressCheckoutPayment" | |
, USER : _USER | |
, PWD : _PWD | |
, SIGNATURE : _SIG | |
, VERSION : "63.0" | |
, TOKEN : token | |
, PAYMENTREQUEST_0_AMT : amt | |
, PAYMENTREQUEST_0_CURRENCYCODE : "TWD" | |
, PAYMENTREQUEST_0_PAYMENTACTION : "Sale" | |
, PAYERID : payerid | |
}; | |
console.log(body); | |
Request.post({ | |
url : "https://api-3t.paypal.com/nvp" | |
, form : body | |
}, function(err, response, body){ | |
body = decodeURIComponent(body); | |
console.log(body); | |
if(err) { | |
next(err); | |
} else if (response.statusCode != 200) { | |
next(new Error(body)); | |
} else { | |
var arr = body.split("&"); | |
var data = {}; | |
for(var i in arr) { | |
var tmp = arr[i].split("="); | |
data[tmp[0].toLowerCase()] = tmp[1]; | |
} | |
next(null, data); | |
} | |
}); | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment