为了账号安全,请及时绑定邮箱和手机立即绑定

在 WooCommerce 中以编程方式对保存的信用卡收费

在 WooCommerce 中以编程方式对保存的信用卡收费

PHP
慕慕森 2021-06-27 09:36:27
我正在 WooCommerce 中以编程方式创建订单,需要从默认保存的信用卡中收费。我正在使用 WooCommerce 条纹插件,并且已经弄清楚如何设置正确的付款方式,但无法弄清楚如何实际向卡收费。下面是我到目前为止的代码。$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();
查看完整描述

1 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

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


注意:您必须使用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();



查看完整回答
反对 回复 2021-07-02
  • 1 回答
  • 0 关注
  • 172 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信