php - 如何向 woocomerce 中的外部 API 支付网关发送 POST 请求?
问题描述
我正在创建一个新的支付网关(Nequi),它在 woocommerce 中不存在,我正在为此做一个插件,但我需要知道出了什么问题,当我下订单时,woocommerce 总是会出错Error processing. Please try again
。支付网关公司向我提供了有关身份验证标头的文档(西班牙语):
https://conecta.nequi.com/content/consumo-del-api-de-nequi-para-pagos-sin-usar-los-sdk
示例请求:
{
"RequestMessage": {
"RequestHeader": {
"Channel": "PNP04-C001",
"RequestDate": "2017-06-21T20:26:12.654Z",
"MessageID": "1234567890",
"ClientID": "12345",
"Destination": {
"ServiceName": "PaymentsService",
"ServiceOperation": "unregisteredPayment",
"ServiceRegion": "C001",
"ServiceVersion": "1.0.0"
}
},
"RequestBody": {
"any": {
"unregisteredPaymentRQ": {
"phoneNumber": "1",
"code": "NIT_1",
"value": "1",
"reference1": "reference1",
"reference2": "reference2",
"reference3": "reference3"
}
}
}
在这一刻,我正在尝试使用硬代码,示例中包含相同的数据。
另一件事是我不知道如何调试我的插件来查看变量,我是 PHP 的新手,API 的所有这些东西都休息了,请帮帮我!
public function process_payment( $order_id )
{
global $woocommerce;
$customer_order = new WC_Order($order_id);
// checking for transiction
$environment = ($this->environment == "yes") ? 'TRUE' : 'FALSE';
// Decide which URL to post to
$environment_url = ("FALSE" == $environment)
? 'https://api.sandbox.nequi.com/payments/v1/-services-paymentservice-unregisteredpayment'
: 'https://api.sandbox.nequi.com/payments/v1/-services-paymentservice-unregisteredpayment';
$unregistered_paymentRQ = [
'phoneNumber' => '1',
'code' => '1',
'value' => '1',
'reference1' => 'reference1',
'reference2' => 'reference2',
'reference3' => 'reference3'
];
$any = [
'unregisteredPaymentRQ' => $unregistered_paymentRQ
];
$request_body = [
'any' => $any
];
$destination = [
'ServiceName' => 'PaymentsService',
'ServiceOperation' => 'unregisteredPayment',
'ServiceRegion' => 'C001',
'ServiceVersion' => '1.0.0'
];
$request_header = [
'Channel' => 'PNP04-C001',
'RequestDate' => '2017-06-21T20:26:12.654Z',
'MessageID' => '1234567890',
'ClientID' => '12345',
'RequestDate' => '2017-06-21T20:26:12.654Z',
'Destination' => $destination
];
$request_msg = [
'RequestHeader' => $request_header,
'RequestBody' => $request_body
];
$payload = [
'RequestMessage' => $request_msg
];
echo $payload;
// Send this payload to Authorize.net for processing
$response = wp_remote_post($environment_url, [
'method' => 'POST',
'body' => http_build_query($payload),
'timeout' => 90,
'sslverify' => false,
]);
if (is_wp_error($response)) {
throw new Exception(__('There is issue for connectin payment gateway. Sorry for the inconvenience.',
'wc-gateway-nequi'));
}
if (empty($response['body'])) {
throw new Exception(__('Authorize.net\'s Response was not get any data.', 'wc-gateway-nequi'));
}
// get body response while get not error
$response_body = wp_remote_retrieve_body($response);
foreach (preg_split("/\r?\n/", $response_body) as $line) {
$resp = explode("|", $line);
}
// values get
$r['StatusCode'] = $resp[0];
$r['StatusDesc'] = $resp[1];
// 1 or 4 means the transaction was a success
if (($r['StatusCode'] == 0)) {
// Payment successful
$customer_order->add_order_note(__('Authorize.net complete payment.', 'wc-gateway-nequi'));
// paid order marked
$customer_order->payment_complete();
// this is important part for empty cart
$woocommerce->cart->empty_cart();
// Redirect to thank you page
return [
'result' => 'success',
'redirect' => $this->get_return_url($customer_order),
];
}
}
解决方案
看起来 request/args 数组的结构不像 WordPress在 codex 中推荐的那样。(争论)
$request_body = [
'any' => [
'unregisteredPaymentRQ' => [
'phoneNumber' => '1',
'code' => '1',
'value' => '1',
'reference1' => 'reference1',
'reference2' => 'reference2',
'reference3' => 'reference3'
]
]
];
$request_headers = [
'content-type' => 'application/json',
'Channel' => 'PNP04-C001',
'RequestDate' => '2017-06-21T20:26:12.654Z',
'MessageID' => '1234567890',
'ClientID' => '12345',
'RequestDate' => '2017-06-21T20:26:12.654Z',
'Destination' => [
'ServiceName' => 'PaymentsService',
'ServiceOperation' => 'unregisteredPayment',
'ServiceRegion' => 'C001',
'ServiceVersion' => '1.0.0'
]
];
$args = [
'method' => 'POST',
'httpversion' => '1.0',
'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url(),
'timeout' => 90,
'sslverify' => false,
'headers' => $request_headers,
'body' => json_encode($request_body)
];
echo $args;
// Send this payload to Authorize.net for processing
$response = wp_remote_post($environment_url, $args);
print_r($response);
另外,我假设 Authorize.net 希望它是 json 中的有效负载,这就是我使用 json_encode 函数并在标头中将内容类型显式设置为 json 的原因。像这样:
'content-type' => 'application/json'
由于我不熟悉 Authorize.net 的 API,这可能是在黑暗中拍摄,但希望它能让您朝着正确的方向前进。
资源
这篇stackoverflow 文章真的很有帮助。
推荐阅读
- javascript - Ajax Uncaught TypeError:非法调用
- javascript - 如何在 reactjs 中访问自定义标头
- ruby-on-rails - 在 ruby 中搜索 imagen 的特定 api 对我不起作用
- python - 合并函数不返回合并的数据框
- crystal-reports-2008 - 如何在 CRYSTAL REPORT 2008 中使用印度货币符号
- c++ - 为什么我的 cout 会同时执行,尽管 cin 应该在两者之间读取?
- wordpress - Wordpress 管理员登录页面无法访问?
- android - Fabric crashlytics 以混淆格式报告崩溃
- docker - 在 Docker 中运行 Redis 服务器时出现 ConnectionError
- jquery - 我的 jquery 代码有问题。如何在此视频中应用音量控制