[英]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. 计算按比例分配的金额,以用作新的每月订阅的一次性折扣。
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- 笔记-
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。
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.