我正在尝试使用 angular 将我的后端付款连接到我的前端卡费用。我怎样才能做到这一点?
I'm trying to connect my back end payment to my front end card charge with angular. How can I achieve this?
正如您想象的那样,stripe 和 authorize.net 以及其他支付网关服务提供了一个 api 出于安全原因只能通过服务器端进行攻击。目前 Authorize.net 的文档允许我创建一个快速节点应用程序,然后 运行 命令节点 charge-credit-card.js (它可以工作并从他们的 api) 我的问题分为两个部分。我如何将我的服务器目录(在本段下方的图片中恰当地命名为 AuthorizePaymentNode)与我的 angular src 应用程序目录(在图像中恰当地命名为 named FoodOrderingApp)连接以在前端收集卡信息,以便我可以从头到尾处理一张信用卡吗?其次,假设我让它在开发中工作,我如何以及在哪里上传我的 AuthorizePaymentNode 目录以及我的 FoodOrderingApp,以便两者一起工作。我是按照我朋友的建议在两个不同的地方做,还是可以一次在一个地方做?
[https://i.stack.imgur.com/ibUDr.png][1]
charge-credit-card.js(当 运行ning node charge-credit-card.js 时非常有效)
var ApiContracts = require('authorizenet').APIContracts;
var ApiControllers = require('authorizenet').APIControllers;
var SDKConstants = require('authorizenet').Constants;
var utils = require('./utils.js');
var constants = require('./constants.js');
function chargeCreditCard(callback) {
var merchantAuthenticationType = new ApiContracts.MerchantAuthenticationType();
merchantAuthenticationType.setName(constants.apiLoginKey);
merchantAuthenticationType.setTransactionKey(constants.transactionKey);
var creditCard = new ApiContracts.CreditCardType();
creditCard.setCardNumber('4242424242424242');
creditCard.setExpirationDate('0822');
creditCard.setCardCode('999');
var paymentType = new ApiContracts.PaymentType();
paymentType.setCreditCard(creditCard);
var orderDetails = new ApiContracts.OrderType();
orderDetails.setInvoiceNumber('INV-12345');
orderDetails.setDescription('Product Description');
var tax = new ApiContracts.ExtendedAmountType();
tax.setAmount('4.26');
tax.setName('level2 tax name');
tax.setDescription('level2 tax');
var duty = new ApiContracts.ExtendedAmountType();
duty.setAmount('8.55');
duty.setName('duty name');
duty.setDescription('duty description');
var shipping = new ApiContracts.ExtendedAmountType();
shipping.setAmount('8.55');
shipping.setName('shipping name');
shipping.setDescription('shipping description');
var billTo = new ApiContracts.CustomerAddressType();
billTo.setFirstName('Ellen');
billTo.setLastName('Johnson');
billTo.setCompany('Souveniropolis');
billTo.setAddress('14 Main Street');
billTo.setCity('Pecan Springs');
billTo.setState('TX');
billTo.setZip('44628');
billTo.setCountry('USA');
var shipTo = new ApiContracts.CustomerAddressType();
shipTo.setFirstName('China');
shipTo.setLastName('Bayles');
shipTo.setCompany('Thyme for Tea');
shipTo.setAddress('12 Main Street');
shipTo.setCity('Pecan Springs');
shipTo.setState('TX');
shipTo.setZip('44628');
shipTo.setCountry('USA');
var lineItem_id1 = new ApiContracts.LineItemType();
lineItem_id1.setItemId('1');
lineItem_id1.setName('vase');
lineItem_id1.setDescription('cannes logo');
lineItem_id1.setQuantity('18');
lineItem_id1.setUnitPrice(45.00);
var lineItem_id2 = new ApiContracts.LineItemType();
lineItem_id2.setItemId('2');
lineItem_id2.setName('vase2');
lineItem_id2.setDescription('cannes logo2');
lineItem_id2.setQuantity('28');
lineItem_id2.setUnitPrice('25.00');
var lineItemList = [];
lineItemList.push(lineItem_id1);
lineItemList.push(lineItem_id2);
var lineItems = new ApiContracts.ArrayOfLineItem();
lineItems.setLineItem(lineItemList);
var userField_a = new ApiContracts.UserField();
userField_a.setName('A');
userField_a.setValue('Aval');
var userField_b = new ApiContracts.UserField();
userField_b.setName('B');
userField_b.setValue('Bval');
var userFieldList = [];
userFieldList.push(userField_a);
userFieldList.push(userField_b);
var userFields = new ApiContracts.TransactionRequestType.UserFields();
userFields.setUserField(userFieldList);
var transactionSetting1 = new ApiContracts.SettingType();
transactionSetting1.setSettingName('duplicateWindow');
transactionSetting1.setSettingValue('120');
var transactionSetting2 = new ApiContracts.SettingType();
transactionSetting2.setSettingName('recurringBilling');
transactionSetting2.setSettingValue('false');
var transactionSettingList = [];
transactionSettingList.push(transactionSetting1);
transactionSettingList.push(transactionSetting2);
var transactionSettings = new ApiContracts.ArrayOfSetting();
transactionSettings.setSetting(transactionSettingList);
var transactionRequestType = new ApiContracts.TransactionRequestType();
transactionRequestType.setTransactionType(ApiContracts.TransactionTypeEnum.AUTHCAPTURETRANSACTION);
transactionRequestType.setPayment(paymentType);
transactionRequestType.setAmount(utils.getRandomAmount());
transactionRequestType.setLineItems(lineItems);
transactionRequestType.setUserFields(userFields);
transactionRequestType.setOrder(orderDetails);
transactionRequestType.setTax(tax);
transactionRequestType.setDuty(duty);
transactionRequestType.setShipping(shipping);
transactionRequestType.setBillTo(billTo);
transactionRequestType.setShipTo(shipTo);
transactionRequestType.setTransactionSettings(transactionSettings);
var createRequest = new ApiContracts.CreateTransactionRequest();
createRequest.setMerchantAuthentication(merchantAuthenticationType);
createRequest.setTransactionRequest(transactionRequestType);
//pretty print request
console.log(JSON.stringify(createRequest.getJSON(), null, 2));
var ctrl = new ApiControllers.CreateTransactionController(createRequest.getJSON());
//Defaults to sandbox
//ctrl.setEnvironment(SDKConstants.endpoint.production);
ctrl.execute(function(){
var apiResponse = ctrl.getResponse();
var response = new ApiContracts.CreateTransactionResponse(apiResponse);
//pretty print response
console.log(JSON.stringify(response, null, 2));
if(response != null){
if(response.getMessages().getResultCode() == ApiContracts.MessageTypeEnum.OK){
if(response.getTransactionResponse().getMessages() != null){
console.log('Successfully created transaction with Transaction ID: ' + response.getTransactionResponse().getTransId());
console.log('Response Code: ' + response.getTransactionResponse().getResponseCode());
console.log('Message Code: ' + response.getTransactionResponse().getMessages().getMessage()[0].getCode());
console.log('Description: ' + response.getTransactionResponse().getMessages().getMessage()[0].getDescription());
}
else {
console.log('Failed Transaction.');
if(response.getTransactionResponse().getErrors() != null){
console.log('Error Code: ' + response.getTransactionResponse().getErrors().getError()[0].getErrorCode());
console.log('Error message: ' + response.getTransactionResponse().getErrors().getError()[0].getErrorText());
}
}
}
else {
console.log('Failed Transaction. ');
if(response.getTransactionResponse() != null && response.getTransactionResponse().getErrors() != null){
console.log('Error Code: ' + response.getTransactionResponse().getErrors().getError()[0].getErrorCode());
console.log('Error message: ' + response.getTransactionResponse().getErrors().getError()[0].getErrorText());
}
else {
console.log('Error Code: ' + response.getMessages().getMessage()[0].getCode());
console.log('Error message: ' + response.getMessages().getMessage()[0].getText());
}
}
}
else {
console.log('Null Response.');
}
callback(response);
});
}
if (require.main === module) {
chargeCreditCard(function(){
console.log('chargeCreditCard call complete.');
});
}
module.exports.chargeCreditCard = chargeCreditCard;
cart.ts
let total = item.price * item.quantity;
item.options.forEach(option => (total += option.value * item.quantity));
return total;
}
get totalAmount() {
let total = 0;
this.cart.forEach(item => (total += this.getItemTotal(item)));
return total;
}```
[1]: https://i.stack.imgur.com/ibUDr.png
使用接受套件似乎是最合乎逻辑的答案
正如您想象的那样,stripe 和 authorize.net 以及其他支付网关服务提供了一个 api 出于安全原因只能通过服务器端进行攻击。目前 Authorize.net 的文档允许我创建一个快速节点应用程序,然后 运行 命令节点 charge-credit-card.js (它可以工作并从他们的 api) 我的问题分为两个部分。我如何将我的服务器目录(在本段下方的图片中恰当地命名为 AuthorizePaymentNode)与我的 angular src 应用程序目录(在图像中恰当地命名为 named FoodOrderingApp)连接以在前端收集卡信息,以便我可以从头到尾处理一张信用卡吗?其次,假设我让它在开发中工作,我如何以及在哪里上传我的 AuthorizePaymentNode 目录以及我的 FoodOrderingApp,以便两者一起工作。我是按照我朋友的建议在两个不同的地方做,还是可以一次在一个地方做?
[https://i.stack.imgur.com/ibUDr.png][1]
charge-credit-card.js(当 运行ning node charge-credit-card.js 时非常有效)
var ApiContracts = require('authorizenet').APIContracts; var ApiControllers = require('authorizenet').APIControllers; var SDKConstants = require('authorizenet').Constants; var utils = require('./utils.js'); var constants = require('./constants.js'); function chargeCreditCard(callback) { var merchantAuthenticationType = new ApiContracts.MerchantAuthenticationType(); merchantAuthenticationType.setName(constants.apiLoginKey); merchantAuthenticationType.setTransactionKey(constants.transactionKey); var creditCard = new ApiContracts.CreditCardType(); creditCard.setCardNumber('4242424242424242'); creditCard.setExpirationDate('0822'); creditCard.setCardCode('999'); var paymentType = new ApiContracts.PaymentType(); paymentType.setCreditCard(creditCard); var orderDetails = new ApiContracts.OrderType(); orderDetails.setInvoiceNumber('INV-12345'); orderDetails.setDescription('Product Description'); var tax = new ApiContracts.ExtendedAmountType(); tax.setAmount('4.26'); tax.setName('level2 tax name'); tax.setDescription('level2 tax'); var duty = new ApiContracts.ExtendedAmountType(); duty.setAmount('8.55'); duty.setName('duty name'); duty.setDescription('duty description'); var shipping = new ApiContracts.ExtendedAmountType(); shipping.setAmount('8.55'); shipping.setName('shipping name'); shipping.setDescription('shipping description'); var billTo = new ApiContracts.CustomerAddressType(); billTo.setFirstName('Ellen'); billTo.setLastName('Johnson'); billTo.setCompany('Souveniropolis'); billTo.setAddress('14 Main Street'); billTo.setCity('Pecan Springs'); billTo.setState('TX'); billTo.setZip('44628'); billTo.setCountry('USA'); var shipTo = new ApiContracts.CustomerAddressType(); shipTo.setFirstName('China'); shipTo.setLastName('Bayles'); shipTo.setCompany('Thyme for Tea'); shipTo.setAddress('12 Main Street'); shipTo.setCity('Pecan Springs'); shipTo.setState('TX'); shipTo.setZip('44628'); shipTo.setCountry('USA'); var lineItem_id1 = new ApiContracts.LineItemType(); lineItem_id1.setItemId('1'); lineItem_id1.setName('vase'); lineItem_id1.setDescription('cannes logo'); lineItem_id1.setQuantity('18'); lineItem_id1.setUnitPrice(45.00); var lineItem_id2 = new ApiContracts.LineItemType(); lineItem_id2.setItemId('2'); lineItem_id2.setName('vase2'); lineItem_id2.setDescription('cannes logo2'); lineItem_id2.setQuantity('28'); lineItem_id2.setUnitPrice('25.00'); var lineItemList = []; lineItemList.push(lineItem_id1); lineItemList.push(lineItem_id2); var lineItems = new ApiContracts.ArrayOfLineItem(); lineItems.setLineItem(lineItemList); var userField_a = new ApiContracts.UserField(); userField_a.setName('A'); userField_a.setValue('Aval'); var userField_b = new ApiContracts.UserField(); userField_b.setName('B'); userField_b.setValue('Bval'); var userFieldList = []; userFieldList.push(userField_a); userFieldList.push(userField_b); var userFields = new ApiContracts.TransactionRequestType.UserFields(); userFields.setUserField(userFieldList); var transactionSetting1 = new ApiContracts.SettingType(); transactionSetting1.setSettingName('duplicateWindow'); transactionSetting1.setSettingValue('120'); var transactionSetting2 = new ApiContracts.SettingType(); transactionSetting2.setSettingName('recurringBilling'); transactionSetting2.setSettingValue('false'); var transactionSettingList = []; transactionSettingList.push(transactionSetting1); transactionSettingList.push(transactionSetting2); var transactionSettings = new ApiContracts.ArrayOfSetting(); transactionSettings.setSetting(transactionSettingList); var transactionRequestType = new ApiContracts.TransactionRequestType(); transactionRequestType.setTransactionType(ApiContracts.TransactionTypeEnum.AUTHCAPTURETRANSACTION); transactionRequestType.setPayment(paymentType); transactionRequestType.setAmount(utils.getRandomAmount()); transactionRequestType.setLineItems(lineItems); transactionRequestType.setUserFields(userFields); transactionRequestType.setOrder(orderDetails); transactionRequestType.setTax(tax); transactionRequestType.setDuty(duty); transactionRequestType.setShipping(shipping); transactionRequestType.setBillTo(billTo); transactionRequestType.setShipTo(shipTo); transactionRequestType.setTransactionSettings(transactionSettings); var createRequest = new ApiContracts.CreateTransactionRequest(); createRequest.setMerchantAuthentication(merchantAuthenticationType); createRequest.setTransactionRequest(transactionRequestType); //pretty print request console.log(JSON.stringify(createRequest.getJSON(), null, 2)); var ctrl = new ApiControllers.CreateTransactionController(createRequest.getJSON()); //Defaults to sandbox //ctrl.setEnvironment(SDKConstants.endpoint.production); ctrl.execute(function(){ var apiResponse = ctrl.getResponse(); var response = new ApiContracts.CreateTransactionResponse(apiResponse); //pretty print response console.log(JSON.stringify(response, null, 2)); if(response != null){ if(response.getMessages().getResultCode() == ApiContracts.MessageTypeEnum.OK){ if(response.getTransactionResponse().getMessages() != null){ console.log('Successfully created transaction with Transaction ID: ' + response.getTransactionResponse().getTransId()); console.log('Response Code: ' + response.getTransactionResponse().getResponseCode()); console.log('Message Code: ' + response.getTransactionResponse().getMessages().getMessage()[0].getCode()); console.log('Description: ' + response.getTransactionResponse().getMessages().getMessage()[0].getDescription()); } else { console.log('Failed Transaction.'); if(response.getTransactionResponse().getErrors() != null){ console.log('Error Code: ' + response.getTransactionResponse().getErrors().getError()[0].getErrorCode()); console.log('Error message: ' + response.getTransactionResponse().getErrors().getError()[0].getErrorText()); } } } else { console.log('Failed Transaction. '); if(response.getTransactionResponse() != null && response.getTransactionResponse().getErrors() != null){ console.log('Error Code: ' + response.getTransactionResponse().getErrors().getError()[0].getErrorCode()); console.log('Error message: ' + response.getTransactionResponse().getErrors().getError()[0].getErrorText()); } else { console.log('Error Code: ' + response.getMessages().getMessage()[0].getCode()); console.log('Error message: ' + response.getMessages().getMessage()[0].getText()); } } } else { console.log('Null Response.'); } callback(response); }); } if (require.main === module) { chargeCreditCard(function(){ console.log('chargeCreditCard call complete.'); }); } module.exports.chargeCreditCard = chargeCreditCard;
cart.ts
let total = item.price * item.quantity; item.options.forEach(option => (total += option.value * item.quantity)); return total; } get totalAmount() { let total = 0; this.cart.forEach(item => (total += this.getItemTotal(item))); return total; }``` [1]: https://i.stack.imgur.com/ibUDr.png
使用接受套件似乎是最合乎逻辑的答案