Braintree paypal 在 codeigniter 中不起作用

Posted

技术标签:

【中文标题】Braintree paypal 在 codeigniter 中不起作用【英文标题】:braintree paypal is not working in codeigniter 【发布时间】:2017-08-16 23:15:27 【问题描述】:

我想将 Braintree paypal 集成到我的 codeigniter 网站中。我在我的控制器构造函数中从服务器加载 Braintree 文件和凭据,并将其他代码放入一个方法中,但它总是给出错误 Unknown or expired payment_method_nonce。下面是方法

public function braintree()
    if($this->session->userdata('user_id') != '' && $this->session->userdata('user_id') != 'user')
        $user_id        = $this->input->post('user_id');
        $amount         = $this->input->post('amount');
        $inscription_id = $this->input->post('inscription_id');

        $user_details = $this->db->get_where('spm_users',array('id'=>$user_id))->row_array();
        if(!empty($user_details->braintree_customer_id))
            $CustomerId =  (string)$user_details->braintree_customer_id;
        else
            $result = Braintree_Customer::create([
                        'firstName' => $user_details->name,
                        'lastName' => $user_details->surname,
                        'email' => $user_details->email,
                        'phone' => $user_details->telephone,
                    ]);
                $CustomerId = (string)$result->customer->id;
                $this->db->where("id",$user_id);
                $this->db->update("spm_users", array('braintree_customer_id'=>$CustomerId));
        
        $clientToken = Braintree_ClientToken::generate([
                        "customerId" => $CustomerId
                    ]);
        $card_id ='';            
        $clientToken_new = Braintree_ClientToken::generate();
        $result1 = Braintree_Transaction::sale([
                      'amount' => $amount,
                      'paymentMethodNonce' => $clientToken_new,
                      'options' => [
                        'submitForSettlement' => True
                      ]
                    ]);
        if($result1->success == true) 
            $updateArr = array(
                'amount'=>$result1->transaction->amount,
                'balance_transaction'=>$result1->transaction->id,
                'inscription_status'=>2,
                'status'=>1,
                'data'=>json_encode($result1),
                'payment_method'        => 'Braintree',
                'payment_date'=>date('Y-m-d H:i:s')
                );
                $this->db->where("id",$inscription_id);
                $this->_db->update("spm_inscription", $updateArr);
                $this->session->set_flashdata('msg','Inscription Payment Success');
                redirect('frontend/paypalpayment/'.$inscription_id);
        else
            $this->session->set_flashdata('msg','Payment failed');
            redirect('frontend/paypalpayment/'.$inscription_id);
            
    else
        redirect('frontend');
     

这是我的构造函数

public function __construct() 
    parent::__construct();
    require_once '/home/public_html/mysite/braintree/Braintree.php';
    Braintree_Configuration::environment('sandbox');
    Braintree_Configuration::merchantId('zxxxxxxxxxxxxxxd');
    Braintree_Configuration::publicKey('7xxxxxxxxxxxxxxx7');
    Braintree_Configuration::privateKey('1xxxxxxxxxxxxxxxxxxxxxx8');

我尝试了谷歌,但没有运气。请帮助并提前感谢。

【问题讨论】:

【参考方案1】:

全面披露:我在 Braintree 工作。如果您还有任何问题,请随时联系support。

来自documentation on Transaction:sale()

要创建交易,您必须包含金额以及 paymentMethodNonce 或 paymentMethodToken。

您在paymentMethodNonce 参数中传递的参数不是payment method nonce。相反,您将其传递给client token,这会导致它失败。这些物品名称相似,但用途却大不相同。

客户端令牌:包含有关您的网关帐户的配置信息。 client-side SDKs 使用它们来正确设置自己的配置并与您的服务器无缝协作,并且不应将它们传递给交易销售调用。 支付方式随机数:对一组标记化支付方式信息的引用,例如信用卡号和到期日期。这些通常由用户输入信用卡信息后客户端 SDK 中的tokenize 调用产生。 付款方式令牌:对您保存在 Braintree 帐户中的付款方式的引用。

要在您的代码中正确创建交易,您必须引用已保存在保险库中的付款方式(使用付款方式令牌),或引用一组新的令牌化付款方式信息客户在您的网站上提交的信息(通过使用付款方式 nonce)。例如,如果您要将客户的付款方式令牌保存在数据库中,您可能会运行如下代码:

    if (!empty($user_details->braintree_customer_id)) 
        $CustomerId = (string) $user_details->braintree_customer_id;
        $CustomerSavedPaymentMethod = (string) $user_details->payment_method_token;
     else 
        ...
    

    $result1 = Braintree_Transaction::sale([
        'amount' => $amount,
        'paymentMethodToken' => $CustomerSavedPaymentMethod,
        'options' => [
            'submitForSettlement' => True
        ]
    ]);

如果您需要一些额外的资源来创建付款方式随机数并将其传回您的服务器,您可以参考our full PHP integration example。

【讨论】:

以上是关于Braintree paypal 在 codeigniter 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

我是不是需要同时购买 Paypal 和 Braintree 帐户才能进行 Paypal 集成?

延迟 Paypal 付款 - Braintree API

用braintree生产账户接受paypal

Braintree 的沙盒 PayPal 集成(使用 JS 和 PHP)

Braintree Paypal 在沙盒中工作,但不是生产

在 PayPal REST API 中查找 Braintree 计费协议 ID