简体   繁体   English

Braintree将订阅从每年更新为每月PHP

[英]Braintree update Subscription from yearly to monthly PHP

I have a Vue App that makes an ajax call to this page to "Update" a subscription I say update but what I am actually doing is canceling the current subscription and adding another. 我有一个Vue应用程序,该应用程序对此页面进行了ajax调用,以“更新”我说的更新订阅,但是我实际上正在做的是取消当前订阅并添加另一个订阅。 I would using the built in update function however according to Braintree's documentation it currently does not support prorating a subscription that has a different billing cycle. 我会使用内置的更新功能,但是根据Braintree的文档,它当前不支持按比例分配具有不同计费周期的订阅。 For example you cant use braintree::update() if you want to update a subscription that reoccurs every year to a subscription that reoccurs every month or vise versa. 例如,如果要将每年重复出现的订阅更新为每月重复出现的订阅,反之亦然,则不能使用braintree :: update()。 The code currently works but I want to prorate. 该代码当前有效,但我想按比例分配。 How can i fake this so that I can prorate these types of subscriptions. 我该如何假冒,以便可以按比例分配这些类型的订阅。 Here's the code I currently have can someone send me a code snippet? 这是我目前拥有的代码,有人可以给我发送代码段吗?

<?php session_start(); ob_start();
  $id=$_SESSION['braintreeid'];
  $receiver='creativegroup@codernoob.com';
  $username=$_SESSION['username'];
  $email = $_SESSION['email'];
   require 'PHPMailer/PHPMailerAutoload.php';
  date_default_timezone_set('America/Denver');
  $request_body = file_get_contents('php://input');
  $json = json_decode($request_body);
  $oldsubscriptionid=$json->oldsubscriptionid;
  require_once 'lib/Braintree.php';

  $gateway = new Braintree_Gateway([
    'environment' => 'sandbox',
    'merchantId' => '********',
    'publicKey' => '*******',
    'privateKey' => '********'
  ]);
$cancelresult=$gateway->subscription()->cancel($oldsubscriptionid);
  $result = $gateway->subscription()->create([
    'paymentMethodToken' => $json->token,
    'planId' => $json->plan
  ]);
if($result){$data['error']=0;
           $data['problemsending']=0;
           $data['emailsent']=0;
           $data['result']=$result;
           } else {$data['error']=1;
                   $data['result']=$result;

                    $mail = new PHPMailer;



                    //$mail->SMTPDebug = 3;                               // Enable verbose debug output



                    $mail->isSMTP();                                      // Set mailer to use SMTP

                    $mail->Host = 'smtp.gmail.com';  // Specify main and backup SMTP servers

                    $mail->SMTPAuth = true;                               // Enable SMTP authentication

                    $mail->Username = 'donotreply@codernoob.com';                 // SMTP username

                    $mail->Password = '*********';                           // SMTP password

                    $mail->SMTPSecure = 'ssl';                            // Enable TLS encryption, `ssl` also accepted

                    $mail->Port = 465;                                    // TCP port to connect to



                    $mail->setFrom('donotreply@codernoob.com');

                    $mail->addAddress($email);     // Add a recipient

                    $mail->addAddress($receiver);               // Name is optional


                    $mail->addBCC(''); //WARNING: SMTP servers will cap 'potential' spammers to no more than 100 recipients per blast, and no more than 500 per day. If you need more than this get a professional SMTP server.



                    $mail->addAttachment('');         // Add attachments

                    $mail->addAttachment('');    // Optional name

                    $mail->isHTML(true);       // Set email format to HTML



                    $mail->Subject = 'codernoob: ERROR Updating Subscription!';



$body = "
                        <html>
                          <head>
                            <title>Error updating Subscription!</title>
                          </head>
                          <body>
                            <h1>There was an error updating subscription</h1>
                            <p>Username: ".$username."</p>
                            <p>Email: ".$email." </p>";
                            $body .= '<br><br>Had an error updating a subscription. If this is the first time you have seen this ignore it as a packet probably just dropped. However, if problem persists please have a web developer address the problem.';

                          $body .= "</body>
                        </html>
                        ";

                    $mail->Body    = $body;


                    if($mail->send()) {$data['emailsent']=1;}
                    else {$data['problemsending']=1;}
                  }
  $customer = $gateway->customer()->find($id);
  $plans = $gateway->plan()->all();

  $plansArray = array();

  foreach ($plans as $plan) {
    array_push($plansArray, $plan);
  }

  $subscriptions = array();

  foreach ($customer->creditCards as $card) {
    foreach ($card->subscriptions as $subscription) {
      array_push($subscriptions, $subscription);
    }
  }
$data['paymentMethods']=$customer->paymentMethods;
$data['plans']=$plansArray;
$data['subscriptions']=$subscriptions;
  echo json_encode($data);
?>

Full disclosure: I work at Braintree. 全面披露:我在Braintree工作。 If you have any further questions, feel free to contact support . 如果您还有其他疑问,请随时与支持小组联系。

Calculate a pro-rated amount to use as a one-time discount on the new monthly subscription. 计算按比例分配的金额,以用作新的每月订阅的一次性折扣。

  • In the Control Panel, create a discount for the monthly plan. 在控制面板中,为每月计划创建一个折扣 Set the default amount to $0 and the number of billing cycles to 1. 将默认金额设置为$ 0,并将计费周期数设置为1。
  • Calculate the amount you want to deduct from the original subscription price as your proration amount. 计算要从原始订阅价格中扣除的金额作为您的按比例分配金额。 Braintree documents their proration formula here if you want to use that as an example. 如果您要使用Braintree作为示例,请在此处记录其按比例分配公式。
  • Create the subscription , using the calculated proration amount as the amount of the discount: 使用计算的按比例分配的金额作为折扣的金额来创建订阅

    $result = $gateway->subscription()->create([ 'paymentMethodToken' => 'the_token', 'planId' => 'silver_plan', 'discounts' => [ 'update' => [ 'existingId' => 'discountId', 'amount' => 'proratedAmountToDiscount', ] $ result = $ gateway-> subscription()-> create(['paymentMethodToken'=>'the_token','planId'=>'silver_plan','discounts'=> [''update'=> ['existingId'=> 'discountId','amount'=>'proratedAmountToDiscount',]
    ] ]); ]]);

Notes- 笔记-

  1. When creating a subscription , it will automatically inherit any add-ons and/or discounts associated with the plan. 创建订阅时 ,它将自动继承与计划相关的所有附加组件和/或折扣。 You can override those details at the time you create or update the subscription. 您可以在创建或更新订阅时覆盖这些详细信息 If you don't need to pro-rate, don't override the discount because the default discount will be $0. 如果您不需要按比例收费,请不要忽略此折扣,因为默认折扣为$ 0。

  2. If the amount of the discount is larger than the amount of the monthly charge, the subscription will be created with a negative balance to be applied to the next billing cycle. 如果折扣金额大于每月费用,则创建的订阅将具有负余额,将应用于下一个计费周期。 Example : A $1 monthly subscription created with a discount of $1.50 will be created with $0 charged the first month and a balance of -$0.50 to be applied the next month. 示例 :将创建具有$ 1.50折扣的每月$ 1订阅,第一个月收取$ 0,下个月余额为-$ 0.50。 The next month's charge will be $0.50 ($1 - $0.50). 下个月的费用为$ 0.50($ 1-$ 0.50)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM