- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在为 Woocommerce 开发 Square Connect 支付网关。
这是给我嵌入网关的网关文件和信用卡表格。
https://docs.connect.squareup.com/articles/adding-payment-form/
现在的流程是Payment form return card nonce,用于从客户那里扣除付款。
这里是示例代码。
require_once 'SquareConnect/autoload.php';
# Assume you have assigned values to the following variables:
# $nonce
# $location_id
# $access_token
$transaction_api = new \SquareConnect\Api\TransactionApi();
$request_body = array (
"card_nonce" => $nonce,
# Monetary amounts are specified in the smallest unit of the applicable currency.
# This amount is in cents. It's also hard-coded for $1, which is not very useful.
"amount_money" => array (
"amount" => 100,
"currency" => "USD"
),
# Every payment you process for a given business have a unique idempotency key.
# If you're unsure whether a particular payment succeeded, you can reattempt
# it with the same idempotency key without worrying about double charging
# the buyer.
"idempotency_key" => uniqid()
);
# The SDK throws an exception if a Connect endpoint responds with anything besides 200 (success).
# This block catches any exceptions that occur from the request.
try {
print_r($transaction_api->charge($access_token, $location_id, $request_body));
} catch (Exception $e) {
echo "Caught exception " . $e->getMessage();
问题是使用 javascript 函数返回付款表单的随机数。
这是我在插件中嵌入表单的方式。
function payment_fields(){
?>
<p class="form-row form-row form-row-wide">
<label>Card Number</label>
<div id="sq-card-number"></div>
</p>
<p class="form-row form-row form-row-wide">
<label>CVV</label>
<div id="sq-cvv"></div>
</p>
<p class="form-row form-row form-row-wide">
<label>Expiration Date</label>
<div id="sq-expiration-date"></div>
</p>
<p class="form-row form-row form-row-wide">
<label>Postal Code</label>
<div id="sq-postal-code"></div>
</p>
<input type="hidden" id="payment_nonce" value="" />
<script src="https://js.squareup.com/v2/paymentform" type="text/javascript"></script>
<script type="text/javascript">
var paymentForm = new SqPaymentForm({
applicationId: 'sandbox-sq0idp-Yjm9KUoP_AiqDuGgwV6q4A', // <-- REQUIRED: Add Application ID
inputClass: 'sq-input',
inputStyles: [
{
fontSize: '15px'
}
],
cardNumber: {
elementId: 'sq-card-number',
placeholder: '.... .... .... ....'
},
cvv: {
elementId: 'sq-cvv',
placeholder: 'CVV'
},
expirationDate: {
elementId: 'sq-expiration-date',
placeholder: 'MM/YY'
},
postalCode: {
elementId: 'sq-postal-code'
},
callbacks: {
cardNonceResponseReceived: function(errors, nonce, cardData) {
if (errors) {
// handle errors
errors.forEach(function(error) { console.log(error.message); });
} else {
// handle nonce
console.log('Nonce received:');
console.log(nonce);
}
},
unsupportedBrowserDetected: function() {
// Alert the buyer that their browser is not supported
}
}
});
function requestCardNonce() {
paymentForm.requestCardNonce();
}
paymentForm.build();
</script>
<?php
}
这是随机数响应
console.log('Nonce received:'); console.log(nonce);
现在不确定如何在 woocomerce 的流程支付部分获得这个随机数?
最佳答案
好的,我自己用 ajax 和 session 变量完成了它。
这是我的代码。
function payment_fields(){
?>
<p class="form-row form-row form-row-wide">
<label>Card Number</label>
<div id="sq-card-number"></div>
</p>
<p class="form-row form-row form-row-wide">
<label>CVV</label>
<div id="sq-cvv"></div>
</p>
<p class="form-row form-row form-row-wide">
<label>Expiration Date</label>
<div id="sq-expiration-date"></div>
</p>
<p class="form-row form-row form-row-wide">
<label>Postal Code</label>
<div id="sq-postal-code"></div>
</p>
<input type="hidden" id="payment_nonce" value="" />
<script src="https://js.squareup.com/v2/paymentform" type="text/javascript"></script>
<script type="text/javascript">
var paymentForm = new SqPaymentForm({
applicationId: '<?php echo $this->api_id; ?>', // <-- REQUIRED: Add Application ID
inputClass: 'sq-input',
inputStyles: [
{
fontSize: '15px'
}
],
cardNumber: {
elementId: 'sq-card-number',
placeholder: '.... .... .... ....'
},
cvv: {
elementId: 'sq-cvv',
placeholder: 'CVV'
},
expirationDate: {
elementId: 'sq-expiration-date',
placeholder: 'MM/YY'
},
postalCode: {
elementId: 'sq-postal-code'
},
callbacks: {
cardNonceResponseReceived: function(errors, nonce, cardData) {
if (errors) {
// handle errors
errors.forEach(function(error) { console.log(error.message); });
} else {
// handle nonce
console.log('Nonce received:');
console.log(nonce);
//localStorage.setItem('card_nonce',nonce);
var ajaxurl = "<?php echo admin_url( 'admin-ajax.php' ); ?>";
var data = {
'action': 'payment_nonce',
'nonce_recived': nonce,
};
jQuery.post(ajaxurl, data, function(response) {
});
}
},
unsupportedBrowserDetected: function() {
// Alert the buyer that their browser is not supported
}
}
});
function requestCardNonce() {
paymentForm.requestCardNonce();
}
paymentForm.build();
jQuery(document).ready(function ($) {
$("form.woocommerce-checkout")
.on('submit', function() { return requestCardNonce(); } );
});
</script>
<style type="text/css">
.sq-input {
border: 1px solid rgb(223, 223, 223);
outline-offset: -2px;
margin-bottom: 5px;
}
.sq-input--focus {
/* how your inputs should appear when they have focus */
outline: 5px auto rgb(59, 153, 252);
}
.sq-input--error {
/* how your inputs should appear when invalid */
outline: 5px auto rgb(255, 97, 97);
}
</style>
<?php
}
// Submit payment and handle response
public function process_payment( $order_id ) {
session_start();
global $woocommerce;
sleep(8);
// Get this Order's information so that we know
// who to charge and how much
$customer_order = new WC_Order( $order_id );
$amount = floatval( preg_replace( '#[^\d.]#', '', $customer_order->order_total ) );
//$cart_total = number_format((int)$customer_order->order_total, 2, '.', '');
$nonce = $_SESSION['nonce_recived'];
$access_token = $this->access_token;
$location_api = new \SquareConnect\Api\LocationApi();
$location_id = $location_api->listLocations($access_token);
$location_arr = json_decode ($location_id);
$location_id = $location_arr->locations[0]->id;
$transaction_api = new \SquareConnect\Api\TransactionApi();
$request_body = array (
"card_nonce" => $nonce,
# Monetary amounts are specified in the smallest unit of the applicable currency.
# This amount is in cents. It's also hard-coded for $1, which is not very useful.
"amount_money" => array (
"amount" => round($amount),
"currency" => "USD"
),
# Every payment you process for a given business have a unique idempotency key.
# If you're unsure whether a particular payment succeeded, you can reattempt
# it with the same idempotency key without worrying about double charging
# the buyer.
"idempotency_key" => uniqid()
);
# The SDK throws an exception if a Connect endpoint responds with anything besides 200 (success).
# This block catches any exceptions that occur from the request.
try {
$payment_sucess = $transaction_api->charge($access_token, $location_id, $request_body);
// Payment has been successful
$customer_order->add_order_note( __( 'payment completed.', 'spyr-square-gateway' ) );
// Mark order as Paid
$customer_order->payment_complete();
// Empty the cart (Very important step)
$woocommerce->cart->empty_cart();
// Redirect to thank you page
return array(
'result' => 'success',
'redirect' => $this->get_return_url( $customer_order ),
);
} catch (Exception $e) {
$error = "Caught exception " . $e->getMessage();
// Transaction was not succesful
// Add notice to the cart
wc_add_notice( $error, 'error' );
// Add note to the order for your reference
$customer_order->add_order_note( 'Error: '. $error);
}
}
关于javascript - Squareup.com 的自定义 Woocommerce 支付网关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36864685/
COM 内存泄漏最常见的原因是什么? 我读过将初始化的 CComBSTR 的地址作为 [out] 参数传递给函数会导致泄漏。我正在寻找像这样枚举其他常见的编程错误。 最佳答案 未能为 COM 对象使用
在COM服务器执行过程中分配一 block 内存,然后通过一个输出参数将该内存块传递给客户端是很常见的。然后,客户端有义务使用 CoTaskMemFree() 等方法释放该内存。 问题是,这 bloc
我有一些 MFC 代码(自定义 CWnd 控件和一些要公开的类),我需要将它们制作成带有接口(interface)的 activex/COM 对象。使用 MFC 支持制作 ATL 项目并以这种方式制作
Devenv.com 是 visual studio 命令行界面,当您键入 devenv/? 时,devenv 的帮助会出现在控制台上。但是,如果没有任何选项,devenv.com 只会调用 deve
如何将 COM 接口(interface)的引用作为 COM 库中的参数传递? 这是示例: 1)客户端代码成功创建coclass并接收到pFunctionDiscovery中的接口(interface
我正在使用 django,我在 s3 中存储了诸如 imgs 之类的东西(为此我使用的是 boto),但最近我收到了这个错误: 'foo.bar.com.s3.amazonaws.com' doesn
我已经使用组件服务 MSC 对话框创建了一个 COM+ 应用程序。我将一个现有的 COM 对象导入到这个新的 COM+ 应用程序中。 我知道可以通过 COM+ 应用程序调用该 COM 对象。我可以简单
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我正在使用通过 COM Interop 包装器公开的第三方 dll。但是,其中一个 COM 调用经常卡住(至少从不返回)。为了至少让我的代码更健壮一些,我异步包装了调用(_getDeviceInfoW
很多年前我读到有一个简单的 php 脚本可以将您的网站重定向到 http://example.com/google.com 到 google.com它适用于正斜杠右侧的任何域。我忘记了这个脚本是什么或
我正在实现我的第一个进程外 COM 服务器(我的第一个 COM 服务器,就此而言)。我已经按照步骤编写了一个 IDL 文件,为代理/ stub DLL 生成代码,编译 DLL,并注册它。 当我检查注册
是否可以在未知接口(interface)上增加 RCW 引用计数? (即不是底层 COM 对象的引用计数) 我有一些旧的 COM 服务器代码 int Method1(object comobject)
我注意到许多关于 COM 的书籍等都指出,在 COM 聚合中实现一个可用作内部对象的对象相对容易。但是,除非我遗漏了什么,否则聚合似乎只能在极其有限的场景中成功,因此只有在明确识别出这种场景时才应提供
假设我正在开发一个安装 COM 组件并安装程序注册它们的应用程序。这很好用。 现在该软件需要从内存棒上运行。如何注册我的库运行时并确保在运行应用程序后清理注册表? 最佳答案 您总是在 XP 或更高版本
我们已经使用Microsoft的ActiveX/COM(VB6)技术开发了一个软件系统。去年,我对自动化构建过程和整个SCM越来越感兴趣。我集中搜索了网络的大部分内容,以获取有关如何使用基于COM的软
我对 com 线程模型有点困惑。 我有一个 inproc 服务器,我想创建一个可从任何线程访问的接口(interface),而不管 CoInitializeEx 中使用的线程模型和/或标志。 当将接口
我的包以旁加载方式安装,并不断遇到特定于应用程序的权限错误。 是的,许多人建议在 regedit 和组件服务中手动更改权限和所有者。 我的应用实际上在组件服务(DCOMCNFG、DCOMCNFG -3
我正在使用第三方应用程序,并调用创建 的实例。我的 COM 对象。这个调用成功了,但是第三方应用程序上的函数没有返回指向创建对象的指针(我不知道为什么)。有没有办法获得指向我的对象的指针? 为了澄清,
我有一个用 C# 编写的托管 COM 对象和一个用 C++(MFC 和 ATL)编写的 native COM 客户端和接收器。客户端创建对象并在启动时向其事件接口(interface)提供建议,并在其
我的应用程序需要注册两个 COM DLL。如果用户有必要的访问权限,它会自动完成,否则可以使用 regsvr32 完成。 . 现在在一些工作站上会发生以下情况: 开始cmd.exe作为管理员 注册第一
我是一名优秀的程序员,十分优秀!