我尝试使用新的Paypal REST API并希望将其以沙盒模式集成到一个简单的网站中,以便查看是否可以实施以下付款流程之一:
1)用户填写付款表格,包括信用卡信息 2)用户点击购买 3)浏览器通过REST API为信用卡存储PayPal库中的信用卡信息(稍后使用的卡ID)。 4)浏览器通过REST API调用为购买创建付款。 5)浏览器调用app服务器以确保正在进行购买。 5)浏览器将用户重定向到paypal提供的url。 6)当在paypal网站上收到用户同意/批准,并将网站重定向回欢迎页面时, 7)在引擎盖下,IPN回调接收付款的确认并将购买标记为付费 8)用户获得对服务应用提供的访问权限
1)用户填写付款表格,包括信用卡信息 2)用户点击购买 4)浏览器通过REST API调用为购买创建付款。 5)浏览器调用app服务器以确保正在进行购买。 5)浏览器将用户重定向到paypal提供的url。 6)当在paypal网站上收到用户同意/批准,并将网站重定向回欢迎页面时, 7)在引擎盖下,IPN回调接收付款的确认并将购买标记为已支付,并使用更多pf购买详细信息,如信用卡类型和最后4位数,以将此信息添加到我的购买对象。 8)用户获得对应用程序提供的服务的访问 8)用户获得对服务应用提供的访问权限
大多数情况下,我走这条道路是因为我不想处理所有这些PCI合规性,并且需要处理;我不关心我的应用程序的客户所在的位置,他们使用的卡号是什么,或者何时使用卡过期,因为我不想使用支付等自动订阅,我想使用不同的型号: 用户免费获得一些服务,但是为了使用其他服务,用户购买改进访问的时间间隔(例如X个月或1年)。 这是我试图实现而不存储信用卡信息或存储尽可能少(PayPal信用卡ID足够我猜)。
我可以使用Paypal REST API实现所有这些吗?
我想做什么:
PaypalAdapter.prototype.sendCreditCardPayment = function (amount, description, creditCard, success, failure) {
var ccNumberResult = this.impl.validator.validateCardNumber(creditCard.number);
if (!ccNumberResult.success) {
return this.impl.$q.reject(ccNumberResult);
}
var cardInfo = {
number: ccNumberResult.number,
type: ccNumberResult.type,
expire_month: creditCard.expireMonth,
expire_year: String(creditCard.expireYear),
cvv2: creditCard.securityCode,
first_name: creditCard.firstName,
last_name: creditCard.lastName
};
var self = this;
var defer = self.impl.$q.defer();
this.impl.storeCardAPI(cardInfo,
function cardTokenCreated(cardTokenReply) {
var paymentSettings = {
intent: self.PaymentIntents.Sale,
redirect_urls: {
return_url: self.urls.returnUrl,
cancel_url: self.urls.cancelUrl
},
payer: {
payment_method: self.PayMethods.CreditCard,
funding_instruments: [
{
credit_card_token: {
credit_card_id: cardTokenReply.id
}
}
]
},
transactions: [
{
amount: {
total: String(amount.toFixed(2)),
currency: self.currencyCode
},
description: description
}
]
};
self.impl.createPaymentAPI(paymentSettings, function paymentCreated(payment) {
defer.resolve(payment);
}, function failedToCreatePayment(pcErr) {
defer.reject(pcErr);
});
},
function failedToStoreCard(ctErr) {
defer.reject(ctErr);
});
return defer.promise.then(success, failure);
};
为了保持上下文更干净,这里还有一些代码:
var defaultHeaders = {
Authorization: 'Bearer ' + securityContext.tokens.paypal.access_token,
Accept: 'application/json'
};
var createPaymentResource = $resource(securityContext.configuration.paypal.endPoint + 'payments/payment', {}, {
sendPayment : {
method:'POST',
headers: defaultHeaders
}
});
var saveCreditCardResource = $resource(securityContext.configuration.paypal.endPoint + "vault/credit-cards", {}, {
storeCreditCard: {
method: 'POST',
headers: defaultHeaders
}
});
function storeCardFunc(cardInfo, success, failure) {
return saveCreditCardResource.storeCreditCard(null, cardInfo, success, failure);
}
function createPaymentFunc(paymentInformation, success, failure) {
return createPaymentResource.sendPayment(null, paymentInformation, success, failure);
}
var adapter = new PaypalAdapter($q, securityContext, creditCardValidator, storeCardFunc, createPaymentFunc);
return adapter;
我得到了什么: 1)我可以通过REST API将信用卡存储到保险库中。 2)我试图创建付款时出现错误500,无论我使用普通信用卡属性填写信用卡资金工具还是尝试使用信用卡代币。
我做错了什么?
我的错误是缺乏知识的一种逻辑。 1)直接信用卡付款(天气用户手动批准(有意图'订单'和payment_method =' credit_card'),或不(' sale'意图和付款方式' credit_card')不适用于我的国家/地区(佐治亚州)。这是我看到错误的唯一原因。 通过developer.paypal.com网站上的Paypal帐户页面发现了这一点...这是令人沮丧的事情。尤其是所有这些过于神秘的内部服务器错误"。如果Paypal至少提供一条信息性消息并且#34;请求的功能不适用于您的帐户,那么我将非常有帮助#34;使用可用/启用功能的信息链接到该页面。 文档有点坏了 - / payment / payment端点不期望某些字段如first_name或订单/付款请求的付款人对象的last_name ......