Wordpress + Woocommerce自定义支付网关

时间:2014-08-24 20:54:20

标签: wordpress woocommerce payment-gateway

关于Woocommerce支付网关的问题。

我已经定制了一个支付网关来接受采购订单,并从插件中正确加载,然后按照ID的方式显示在结帐页面上;我认为这是一个非常好的开始。

无论如何,我有一个非标准的表单条目(购买订单号),其ID类似于人们要填写,但我不知道如何将其附加到我的自定义支付网关,以便它出现在生成的管理端页。

这一切都很好:

function payment_fields(){
    if ( $description = $this->get_description() )
        echo wpautop( wptexturize( $description ) );
    global $woocommerce;
    ?>
<form class="form-horizontal" role="form" id="bv-form">
<fieldset>
<!-- Form Name -->
  <legend>Purchase Order</legend>
  <!-- Text input-->
    <div class="form-group">
      <label class="control-label" for="po_no">PO Number</label>  
      <div class="">
      <input id="po_no" name="po_no" type="text" placeholder="" class="form-control input-md">
      </div>
    </div>
...

但是当我到达此处时,我不知道如何修改process_payment( $order_id )(或添加到functions.php的内容)以从付款字段中获取表单值。我看到有$order->billingAddress1等,我将如何提交额外的情侣表格字段以及其次,然后,如何从新创建的{{po_no中获取WC_Order 1}}?

  • WP:3.9.2
  • WC:2.1.11

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

如果您要创建自定义付款网关,则应在其中实施process_payment()。此代码可以访问付款表单提交的$_POST变量,因此您可以将其称为:

$po_number = ( isset( $_POST['po_no'] ) )? $_POST['po_no'] : 0;

这说起来听起来像你的问题,你可能实际上并没有编写自定义网关,而是尝试将自定义字段附加到订单中。如果你想挂钩到另一个网关(如PayPal,Authorize.net等),你应该使用作为WC_Order.payment_complete()的一部分调用的WooCommerce动作挂钩,这是网关收集付款后调用的。操作是woocommerce_pre_payment_complete,它在其他任何操作之前运行,并将订单ID作为参数,并在设置stock / status / etc之后设置woocommerce_payment_complete

add_action( 'woocommerce_payment_complete', 'my_woocommerce_payment_complete');
function my_woocommerce_payment_complete( $order_id ){
    $po_number = ( isset( $_POST['po_no'] ) )? $_POST['po_no'] : 0;
    update_post_meta( $order_id, 'po_number', $po_number );
}

然后,您可以通过添加元框在“订单编辑”页面上显示此自定义字段。如果您想让它可编辑,您需要加入save_post并将po_number更改为输入。

add_action( 'add_meta_boxes',  'po_number_metabox' );
function add_po_number_metabox(){
    global $post;
    if ( $post->post_type = 'shop_order' ){
            add_meta_box( 'po-number', 'Title',  'po_number_metabox', 'shop_order', 'side', 'default');
    }
}
function po_number_metabox(){
    global $post;
    $po_number = get_post_meta( $post->ID, 'po_number', true);
    echo "PO:> {$po_number}";
}