Я не знаю, является ли это правильным способом сделать это, но я больше не получаю первоначальную ошибку.
Во-первых, я создал несколько скрытых полей для соответствующих элементов, которые я хотел опубликовать, наряду с присвоением каждому входу идентификатора - следующие скрытые поля:
Во-вторых, я создал отдельный PayPalService, чтобы разделить функциональность, а также, я хотел, чтобы эти сообщения проходили через мой перехватчик, чтобы поместить jwt в заголовки:
import { Injectable } from "@angular/core";
import { HttpClient, HttpHeaders, HttpResponse } from "@angular/common/http";
import { ShoppingCartService } from "./shopping-cart.service";
import { ProductService } from "./product.service";
import { LoginService } from "./login.service";
@Injectable({
providedIn: "root"
})
export class PaypalService {
constructor(
private http: HttpClient,
private loginSrvc: LoginService,
private prdSrvc: ProductService,
private cartSrvc: ShoppingCartService
) {}
addScript = false;
paypalLoad = true;
finalAmount;
subTotal;
paypalConfig = {
env: "sandbox",
client: {
sandbox:
"",
production: ""
},
commit: true,
payment: function(data, actions) {
return actions.payment.create({
transactions: [
{
amount: {
total: document.getElementById("total").value,
currency: "USD",
details: {
subtotal: document.getElementById("subTotal").value,
tax: (document.getElementById("total").value * 0.07).toFixed(2),
shipping: (document.getElementById("total").value * 0.03).toFixed(2),
handling_fee: "1.00",
shipping_discount: "0.00",
insurance: (document.getElementById("total").value * 0.01).toFixed(2)
}
},
description: "The payment from for-her application.",
/* custom: "90048630024435", */
invoice_number: document.getElementById("orders_id").value, // Insert a unique invoice number
payment_options: {
allowed_payment_method: "INSTANT_FUNDING_SOURCE"
},
soft_descriptor: document.getElementById("user_id").value,
item_list: {
items: [document.getElementById("product").value],
shipping_address: {
recipient_name: (document.getElementById("firstName").value + " " + document.getElementById("lastName").value),
line1: document.getElementById("address").value,
line2: document.getElementById("address2").value,
city: document.getElementById("city").value,
country_code: document.getElementById("country").value,
postal_code: document.getElementById("zip").value
phone: document.getElementById("phone").value,
state: document.getElementById("state").value,
email: document.getElementById("email").value
}
}
}
],
note_to_payer: "Contact us for any questions on your order."
});
},
onAuthorize: (data, actions) => {
return actions.payment.execute().then(payment => {
// Do something when payment is successful.
// window.alert("Thank you for your purchase! You order will be processed and shipped as soon as possible");
document.getElementById("myModal").style.display = "block";
document.getElementById("ModalBackdrop").style.display = "block";
this.cartSrvc.postCart();
});
}
};
addPaypalScript() {
this.addScript = true;
return new Promise((resolve, reject) => {
const scripttagElement = document.createElement("script");
scripttagElement.src = "https://www.paypalobjects.com/api/checkout.js";
scripttagElement.onload = resolve;
document.body.appendChild(scripttagElement);
});
}
public getSubTotal() {
this.subTotal = (document.getElementById("total").value) -
((document.getElementById("total").value * 0.07) +
(document.getElementById("total").value * 0.03) +
(document.getElementById("total").value * 0.01) +
1.00);
return this.subTotal.toFixed(2);
}
public getToken(): string {
return localStorage.getItem("jwt");
}
}
Конечно, теперь у меня есть другая ошибка искаженного запроса, который помещен внутри jsonlint и, как вы можете видеть, он вернулся как действительный:
Но главное, чтобы параметры / свойства работали:
Если кто-нибудь может сказать мне, о чем новая ошибка, то я бы будь благодарен.
Error: Request to post https://www.sandbox.paypal.com/v1/payments/payment failed with 400 error. Correlation id: f31569c675597, f31569c675597
{
"name": "MALFORMED_REQUEST",
"message": "Incoming JSON request does not map to API request",
"information_link": "https://developer.paypal.com/webapps/developer/docs/api/#MALFORMED_REQUEST",
"debug_id": "f31569c675597"
}
request/<@https://www.paypalobjects.com/api/checkout.js:14216:39
Еще раз спасибо @ paulsm4 за предложение заглянуть под вкладку «Сеть», чтобы увидеть, действительно ли значение было опубликовано.
Это - немного hacky, но делает задание:
#!/bin/sh
list1="1 2 3"
list2="a b c"
while [ -n "$list1" ]
do
head1=`echo "$list1" | cut -d ' ' -f 1`
list1=`echo "$list1" | sed 's/[^ ]* *\(.*\)$/\1/'`
head2=`echo "$list2" | cut -d ' ' -f 1`
list2=`echo "$list2" | sed 's/[^ ]* *\(.*\)$/\1/'`
echo $head1 $head2
done
Вероятно, не портативный (смотрят на все те измы удара!), но легко читать, и кто-то еще мог бы найти это полезным...
list1="a b c"
list2="1 2 3"
array1=($list1)
array2=($list2)
count=${#array1[@]}
for i in `seq 1 $count`
do
echo ${array1[$i-1]} ${array2[$i-1]}
done
Это должно быть довольно чистым решением, но если Вы не используете bash
обработайте substition, он требует использования временных файлов. Я не знаю, лучше ли это или хуже, чем вызов cut
и sed
по каждому повторению.
#!/bin/sh
list1="1 2 3"
list2="a b c"
echo $list1 | sed 's/ /\n/g' > /tmp/a.$$
echo $list2 | sed 's/ /\n/g' > /tmp/b.$$
paste /tmp/a.$$ /tmp/b.$$ | while read item1 item2; do
echo $item1 - $item2
done
rm /tmp/a.$$
rm /tmp/b.$$
Решение, не используя массивы:
list1="aaa1 aaa2 aaa3"
list2="bbb1 bbb2 bbb3"
tmpfile1=$( mktemp /tmp/list.XXXXXXXXXX ) || exit 1
tmpfile2=$( mktemp /tmp/list.XXXXXXXXXX ) || exit 1
echo $list1 | tr ' ' '\n' > $tmpfile1
echo $list2 | tr ' ' '\n' > $tmpfile2
paste $tmpfile1 $tmpfile2
rm --force $tmpfile1 $tmpfile2
Как один лайнер:
list2="1 2 3";
list1="a b c";
for i in $list1; do
x=`expr index "$list2" " "`;
[ $x -eq 0 ] && j=$list2 || j=${list2:0:$x};
list2=${list2:$x};
echo "$i $j";
done
NEVERMIND, ВИДЕЛ "ГРАНИЦУ" и думал "ГРАНИЦА СНОВА". Отъезд этого здесь, потому что это могло бы быть полезно для кого-то, но ясно не ответа на вопрос, который задают, извините!
--
Это имеет некоторые недостатки (это корректно не обрабатывает списки, которые являются различными размерами), но это работает на пример, который Вы дали:
#!/bin/bash
list1="a b c"
list2="1 2 3"
c=0
for i in $list1
do
l1[$c]=$i
c=$(($c+1))
done
c=0
for i in $list2
do
echo ${l1[$c]} $i
c=$(($c+1))
done
Существует больше корректных способов использовать общие инструменты Unix как awk и сокращение, но вышеупомянутое является реализацией чистого удара согласно просьбе
Комментируя принятый ответ, это не работало на меня или в Linux или в Солярисе, проблемой был \S ярлык класса символов в regexp для sed. Я заменил его [^], и это работало:
#!/bin/sh
list1="1 2 3"
list2="a b c"
while [ -n "$list1" ]
do
head1=`echo "$list1" | cut -d ' ' -f 1`
list1=`echo "$list1" | sed 's/[^ ]* *\(.*\)$/\1/'`
head2=`echo "$list2" | cut -d ' ' -f 1`
list2=`echo "$list2" | sed 's/[^ ]* *\(.*\)$/\1/'`
echo $head1 $head2
done
Я работал над находящимся в sed ответом, когда первые решения запустили показ здесь. Но после дальнейшего расследования, оказалось, что объекты в списке были разделены новыми строками, не пробелами, которые позволили мне идти с решением на основе головы и хвоста:
original_revs="$(cd original && git rev-parse --all)" &&
working_revs="$(cd working && git rev-parse --all)" &&
while test -n "$original_revs"; do
original_commit="$(echo "$original_revs" | head -n 1)" &&
working_commit="$(echo "$working_revs" | head -n 1)" &&
original_revs="$(echo "$original_revs" | tail -n +2)" &&
working_revs="$(echo "$working_revs" | tail -n +2)" &&
...
done
Я отправляю это на всякий случай, кто-то встречается с этим вариантом проблемы, но я награждаю принятый ответ на основе проблемы, как отправлено.