Skip to content

Instantly share code, notes, and snippets.

@Fandora
Created March 16, 2012 02:47
Show Gist options
  • Save Fandora/2048208 to your computer and use it in GitHub Desktop.
Save Fandora/2048208 to your computer and use it in GitHub Desktop.
node.js + paypal express checkout
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