2017-09-11 130 views
1

我正在使用带有测试密钥的Stripe API。我已将付款表单成功发布到Stripe API端点,但未创建任何事件。当我检查条带事件/日志时,我可以在日志选项卡下看到我提交的测试付款200 - Ok的成功消息,但事件选项卡保持空白。似乎无法弄清楚这一点。我的代码如下。条带API状态200正常无事件创建

这里是我的支付处理PHP:

function wpay_stripe_process_payment() { 
    if(isset($_POST['action']) && $_POST['action'] == 'stripe' && wp_verify_nonce($_POST['stripe_nonce'], 'stripe-nonce')) { 

     global $stripe_options; 

     // load the stripe libraries 
     require_once(STRIPE_BASE_DIR . '/lib/Stripe.php'); 

     // retrieve the token generated by stripe.js 
     $token = $_POST['stripeToken']; 

     // check if we are using test mode 
     if(isset($stripe_options['test_mode']) && $stripe_options['test_mode']) { 
      $secret_key = $stripe_options['test_secret_key']; 
     } else { 
      $secret_key = $stripe_options['live_secret_key']; 
     } 

     // attempt to charge the customer's card 
     try { 
      Stripe::setApiKey($secret_key); 
      $charge = Stripe_Charge::create(array(
        'amount' => 1000, // $10 
        'currency' => 'usd', 
        'card' => $token 
       ) 
      ); 


      // redirect on successful payment 
      $redirect = add_query_arg('payment', 'paid', $_POST['redirect']); 

     } catch (Exception $e) { 
      // redirect on failed payment 
      $redirect = add_query_arg('payment', 'failed', $_POST['redirect']); 
     } 

     // redirect back to our previous page with the added query variable 
     wp_redirect($redirect); exit; 
    } 
} 
add_action('wpay_stripe_process_payment'); 

这里是我发送支付信息JS:

Stripe.setPublishableKey(stripe_vars.publishable_key); 

function stripeResponseHandler(status, response) { 
    if (response.error) { 
     // show errors returned by Stripe 
     jQuery(".payment-errors").html(response.error.message); 
     // re-enable the submit button 
     jQuery('#stripe-submit').attr("disabled", false); 
    } else { 
     var form$ = jQuery("#stripe-payment-form"); 
     // token contains id, last4, and card type 
     var token = response['id']; 
     // insert the token into the form so it gets submitted to the server 
     form$.append("<input type='hidden' name='stripeToken' value='" + token + "'/>"); 
     // and submit 
     form$.get(0).submit(); 
    } 
} 
jQuery(document).ready(function($) { 
    $("#stripe-payment-form").submit(function(event) { 
     // disable the submit button to prevent repeated clicks 
     $('#stripe-submit').attr("disabled", "disabled"); 

     // send the card details to Stripe 
     Stripe.createToken({ 
      number: $('.card-number').val(), 
      cvc: $('.card-cvc').val(), 
      exp_month: $('.card-expiry-month').val(), 
      exp_year: $('.card-expiry-year').val() 
     }, stripeResponseHandler); 

     // prevent the form from submitting with the default action 
     return false; 
    }); 
}); 

JSON响应:

{ 
    "id": "tok_1B12dQG6oQhg3oEDNlZLFORy", 
    "object": "token", 
    "card": { 
    "id": "card_1B12dQG6oQhg3oEDIQa4fiCe", 
    "object": "card", 
    "address_city": null, 
    "address_country": null, 
    "address_line1": null, 
    "address_line1_check": null, 
    "address_line2": null, 
    "address_state": null, 
    "address_zip": null, 
    "address_zip_check": null, 
    "brand": "Visa", 
    "country": "US", 
    "cvc_check": "unchecked", 
    "dynamic_last4": null, 
    "exp_month": 4, 
    "exp_year": 2018, 
    "funding": "credit", 
    "last4": "4242", 
    "metadata": { 
    }, 
    "name": null, 
    "tokenization_method": null 
    }, 
    "client_ip": "187.232.128.105", 
    "created": 1505177536, 
    "livemode": false, 
    "type": "card", 
    "used": false 
} 
+0

您可以在200 - OK日志中添加JSON响应吗? – Spartacus

+0

@spartacus我已经使用JSON响应更新了帖子 –

回答

1

对我来说,它看起来像你没有提供您的令牌右键,根据条纹文档:https://stripe.com/docs/charges

此:

$charge = Stripe_Charge::create(array(
    'amount' => 1000, // $10 
    'currency' => 'usd', 
    'card' => $token // I think the key here needs to be "source" 
)); 

应该是这样的:

$charge = Stripe_Charge::create(array(
    'amount' => 1000, // $10 
    'currency' => 'usd', 
    'source' => $token 
)); 

对我而言,我使用它们提供的Stripe PHP库,而不是:

Stripe_Charge::create(...); 

我使用:

\Stripe\Charge::create(...); 

但实际上我认为这个问题可能是你需要做你收费时使用“源”,而不是“卡”。

1

你的条纹令牌在response.id,而不是response['id']

// token contains id, last4, and card type 
var token = response.id; 

响应是一个JSON对象,因此您必须像处理任何其他js对象一样遍历对象。

+0

其实,响应['id']工作得很好。我用这种方式没有问题。 –

+0

我已经在我的前端使用了括号表示的Stripe API失败。但是,我认为你的答案可能会触及真正的问题。它应该是(在PHP中)“源”,而不是“卡”。提高你的答案。 – Spartacus

+1

其实,现在你提到它,它应该是response.id。即使是条纹文档也是如此。我也赞成你。这是相关的,应该加以解决。 –