在 WooCommerce 中以编程方式对保存的信用卡收费 [英] Charge Saved Credit Cards Programmatically in WooCommerce

查看:21
本文介绍了在 WooCommerce 中以编程方式对保存的信用卡收费的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在 WooCommerce 中以编程方式创建订单,需要从默认保存的信用卡中收费.我正在使用 WooCommerce 条纹插件,并且已经弄清楚如何设置正确的付款方式,但无法弄清楚如何实际向卡收费.下面是我到目前为止的代码.

I am creating an order programmatically in WooCommerce and need to charge the default saved credit card. I am using the WooCommerce stripe plugin and have figured out how to set the correct payment method but can't figure out how to actually charge the card. Below is the code I have so far.

$order = wc_create_order();

$order->add_product( wc_get_product( 52 ), 1 );
$order->set_address( $shipping_address, 'shipping' );
$order->set_address($user_info, 'billing');

$payment_gateways = WC()->payment_gateways->payment_gateways();
$order->set_payment_method($payment_gateways['stripe']);

$order->calculate_totals(); 
$order->update_status("Completed", 'First Partner Order', TRUE);
$order->save();

推荐答案

我想出了一个解决方案,虽然不是很优雅,但它似乎有效.基本前提是我们使用stripe api创建一个charge,然后手动添加所有的自定义字段.这将导致成功收费,该费用反映在 woocommerce 中,稍后可以通过管理员退款.下面是带注释的代码.我很想知道是否有人找到了更好的解决方案.

I was able to figure out a solution, although not very elegant, it seems to work. The basic premise is that we use the stripe api to create a charge and then add all the custom fields manually. This will result in a successful charge that is reflected in woocommerce and can be refunded via the admin later on. Below is the code with comments. I would love to know if anybody has found a better solution.

注意:您必须使用 sripe php api

$order = wc_create_order();

$order->add_product( wc_get_product( 52 ), 1 ); //Add product to order
$order->set_address( $shipping_address, 'shipping' ); //Add shipping address
$order->set_address($user_info, 'billing'); //Add billing address

//Set payment gateways
$payment_gateways = WC()->payment_gateways->payment_gateways();
$order->set_payment_method($payment_gateways['stripe']);

$order->calculate_totals(true); //setting true included tax 
//Try to charge stripe card
try {

  // Get stripe  test or secret key from woocommerce settings
  $options = get_option( 'woocommerce_stripe_settings' );
  $stripeKey = 'yes' === $options['testmode'] ? $options['test_secret_key'] : 
  $options['secret_key'] ;

  //Set the Stripe API Key
  \Stripe\Stripe::setApiKey($stripeKey);

  //Get Stripe customer token that was created when the card was saved in woo
  $tokenString = get_user_meta($user_id, '_stripe_customer_id', true);

  //Get total for the order as a number
  $total = intval($order->get_total());
  $totalNoDec = $total * 100;

  //Charge user via Stripe API
  $charge = \Stripe\Charge::create([
    'amount' => $totalNoDec,
    'currency' => 'usd',
    'customer' => $tokenString,
  ]);

  //Set all the meta data that will be needed
  $order->update_meta_data( '_transaction_id', $charge->id );
  $order->update_meta_data( '_stripe_source_id', $charge->payment_method );
  $order->update_meta_data( '_stripe_charge_captured', 'yes'  );
  $order->update_meta_data( '_stripe_currency', $charge->currancy);
  $order->update_meta_data( '_stripe_customer_id', $charge->customer);

} catch (\Stripe\Error\Base $e) {
  // Code to do something with the $e exception object when an error occurs
  echo($e->getMessage());
} catch (Exception $e) {
  echo($e->getMessage());
  // Catch any other non-Stripe exceptions
}

//Set order status to processing
$order->set_status("processing");
$order->save();

这篇关于在 WooCommerce 中以编程方式对保存的信用卡收费的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆