Я использую Wordpress, но я использую нестандартное решение, потому что мой клиент запросил его специально. У меня есть этот Javascript, который создает форму, и когда форма отправляется, он создает файл cookie с токеном в нем, поэтому я могу получить его из PHP, это выглядит так:
<form action = "/wp-content/themes/betheme/includes/add_payment_method.php" method = "post" id = "add-card-form">
<div class = "form-row">
<label for = "card-element">
Credit or debit card
</label>
<div id = "card-element"></div>
<!-- Used to display Element errors. -->
<div id = "card-errors" role = "alert"></div>
</div>
<button>Add payment method</button>
</form>
<script src = "https://js.stripe.com/v3/"></script>
<script>
var style = {
base: {
color: '#ffffff',
fontSize: '14px',
fontSmoothing: 'antialiased',
'::placeholder': {
color: '#ccc',
},
iconColor: "#fff"
},
invalid: {
color: '#e5424d',
':focus': {
color: '#303238',
},
},
};
var stripe = Stripe('xxxxxxxxxxxxxxxxxxxxxxx');
var elements = stripe.elements();
var cardElement = elements.create('card', {style: style, hidePostalCode: true});
window.mobilecheck = function() {
var check = false;
(function(a){if (/(android|bb\d+|meego).+mobile|avantgo|bada/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
return check;
};
if (mobilecheck()) {
cardElement.mount('#Content > div > div > div > div.section.mcb-section.hide-desktop > div > div > div > div > div > div > div > form > div.form-row >div#card-element');
}
else {
cardElement.mount('#Content > div > div > div > div.section.mcb-section.hide-tablet.hide-mobile > div > div > div > div > div > div > div > form > div.form-row > div#card-element');
}
cardElement.addEventListener('change', function(event) {
var displayError = document.getElementById('card-errors');
if (event.error) {
displayError.textContent = event.error.message;
} else {
displayError.textContent = '';
}
});
// Create a token or display an error when the form is submitted.
var form = document.getElementById('add-card-form');
form.addEventListener('submit', function(event) {
event.preventDefault();
stripe.createToken(cardElement).then(function(result) {
if (result.error) {
// Inform the customer that there was an error.
var errorElement = document.getElementById('card-errors');
errorElement.textContent = result.error.message;
} else {
// Send the token to your server.
stripeTokenHandler(result.token);
}
});
});
function createCookie(name, value, days) {
var expires;
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires = " + date.toGMTString();
} else {
expires = "";
}
document.cookie = escape(name) + " = " + escape(value) + expires + "; path=/";
}
function stripeTokenHandler(token) {
createCookie("stripe_token", token, 1);
var form = document.getElementById('add-card-form');
form.submit();
}
</script>
Когда форма отправлена, она выполняет этот PHP в add_payment_method.php:
<?php
require_once("../../../../wp-load.php");
submit_stripe_payment_method($_COOKIE['stripe_token']);
?>
В моем файле functions.php для моей темы у меня есть:
require_once('stripe-php/init.php');
....
function submit_stripe_payment_method($token) {
print_r($token);
$current_user_id = get_current_user_id();
echo 'Your User ID is: ' .$current_user_id;
$customer_id = get_user_meta( $current_user_id, '_stripe_customer_id', true );
echo "CUSTOMER_ID: ".(string)$customer_id;
\Stripe\Stripe::setApiKey("xxxxxxxxxxxxxxxxxxxxxxx");
echo "MADE IT HERE";
$customer = \Stripe\Customer::retrieve((string)$customer_id);
echo "CUSTOMER: ".$customer;
$customer_card = $customer->sources->create(["source" => $token]);
echo "<pre>";
var_dump($customer_card);
echo "</pre>";
}
Результат вышеизложенного:
[object Object]Your User ID is: 1CUSTOMER_ID: cus_DsoF18uw1dR0ujMADE IT HERE
Как видите, до echo "СДЕЛАНО ЗДЕСЬ" добрался только "MADE IT HERE".
Я проверил в веб-консоли Stripe, что $customer_id, который я использую, правильный, и у меня нет ошибок, PHP или других. Единственное, о чем я могу думать, это то, что я неправильно использую токен, но это кажется довольно простым. Как видите, $token печатается как [Объект объекта], и он делает это независимо от того, как я пытаюсь его зарегистрировать, поэтому я не могу точно увидеть, что это такое, но это имеет смысл, потому что он содержит конфиденциальную информацию, используемую для проверки кредитная карта ... также, возможно, она никогда не дойдет до этого момента, потому что я никогда не вижу оператора echo "CUSTOMER: ".$customer;, поэтому, возможно, он зависает:
$customer = \Stripe\Customer::retrieve((string)$customer_id);
Кроме того, я сначала попробовал описанное выше без (string), но получил тот же результат.
Итак, после всего этого я проверяю консоль Stripe, и карта не добавляется.
ОБНОВИТЬ
По-видимому, версия API, которую я использую, не является последней версией, я могу обновить ее, я просто хочу знать, думает ли кто-нибудь, что это возможное решение, прежде чем я это сделаю. Поскольку это может изменить принцип работы полосы на всем сайте (с помощью плагина). Я использую 2018-02-28 и могу перейти на 2018-09-24
. Я также тестирую среду localhost, поэтому я не https, но я не думаю, что это имеет значение для тестирования.
ОБНОВИТЬ
Я понял, что не добавил конечную точку для моей установки localhost в область администрирования консоли stripe. Для этого мне пришлось использовать ngrok (как предлагает Stripe, если вы используете localhost). Я использую localhost на порте 8888, поэтому я сделал ./ngrok http 8888, а затем попробовал еще раз, но это не сработало. В Wordpress сказано, что конечная точка будет enable you to receive notifications on the charge statuses.. Так что, возможно, это не актуально для добавления метода оплаты. Я использовал URL-адрес http для ngrok, а не URL-адрес https.
ОБНОВИТЬ
Я вручную установил stripe-php, поэтому попробовал с composer, но это не помогло, результат тот же.
ОБНОВИТЬ
Я изменил свой ключ на secret key, и это позволило мне получить $customer, но я не вижу никаких выходных данных для $customer_card, и когда я смотрю на приборную панель, карта не была создана.
ОБНОВИТЬ
Я проверил панель управления Stripe и получаю сообщение об ошибке при попытке создать источник:
{
"error": {
"code": "resource_missing",
"doc_url": "https://stripe.com/docs/error-codes/resource-missing",
"message": "No such token: [object Object]",
"param": "source",
"type": "invalid_request_error"
}
}
Что я делаю не так с токеном?
ОБНОВИТЬ
Решение проблемы с токеном: в тестовом режиме токен представляет собой просто строку, которая соответствует номеру тестовой кредитной карты, которую вы используете, мне нужен "tok_visa" для 4242424242424242. https://stripe.com/docs/testing



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проблема может быть в том, что в линию
\ Stripe \ Stripe :: setApiKey ("xxxxxxxxxxxxxxxxxxxxxxx");
вы используете Publishable key, начиная с pk_xxx, вместо этого вы должны использовать Secret Keysk_xxxx в своей учетной записи.
Вы могли видеть ошибки в Stripe Dashboard
после входа в систему.
Сообщите мне, если это поможет
РЕДАКТИРОВАТЬ
Мне также нужно было использовать тестовый токен, который представляет собой просто строку, соответствующую номеру тестовой кредитной карты, которую вы используете. https://stripe.com/docs/testing. См. Вкладку Tokens.
спасибо, это сработало, теперь я могу получить клиента, но карта с токеном в качестве «источника» не добавляется, я обновлю свой вопрос выводом. дайте мне знать, если у вас есть идеи, спасибо
Вы должны попробовать
print_r($customer); die;вместоecho $customer;