Как я могу вернуть подписку при повторной покупке?

#php #recurly

#php #recurly

Вопрос:

Я создаю пользовательскую проверку с помощью Recurly PHP-клиента. Поскольку мы используем нашу собственную логику шлюза, мы вынуждены использовать метод Create Purchase в отличие от Create Subscription (поскольку Create Subscription не принимает gateway_code в качестве параметра). Создать подписку возвращает созданную подписку — просто!

Но Create Purchase возвращает коллекцию счетов. Это можно разобрать на части, чтобы найти вновь созданный $subscription объект, но это вряд ли похоже на предполагаемый процесс. Есть (надеюсь) более чистый способ сделать это?

Мой метод покупки следующий — смотрите Комментарии к коду.

 protected static function create_subscription( $user_id, $args ) {

    $result = false;

    $purchase = new Recurly_Purchase();
    $purchase->currency          = $args['currency'];
    $purchase->collection_method = 'automatic';
    $purchase->gateway_code      = $args['gateway_code'];

    $account             = new Recurly_Account( $user_id );
    $account->email      = $args['email'];
    $account->first_name = $args['billing_first_name'];
    $account->last_name  = $args['billing_last_name'];
    $account->vat_number = $args['vat_number'];

    $billing_info           = new Recurly_BillingInfo();
    $billing_info->token_id = $args['recurly_token'];

    $account->billing_info = $billing_info;

    $purchase->account = $account;

    $subscription            = new Recurly_Subscription();
    $subscription->plan_code = $args['plan_code'];

    $purchase->subscriptions = array( $subscription );

    try {
        // "invoice" is the method to transact a Recurly_Purchase.
        $purchase = Recurly_Purchase::invoice( $purchase );
        if( $purchase instanceof Recurly_InvoiceCollection ) {
           // this seems incredibly janky and error-prone
           $result = reset( $purchase->charge_invoice->line_items )->subscription->get();
        }
    } catch ( Exception $e ) {
        $result = $e;
    }
    // I need this to return the $subscription object generated by the purchase
    return $result;

}
  

Ответ №1:

Когда вы создаете подписку, успешный ответ будет включать UUID для этой подписки. Я не разработчик PHP, но это может выглядеть примерно так:

  $subscription = new Recurly_Subscription();
 $subscription->plan_code = $args['plan_code'];
 $subscription->account = $account;
 $subscription->currency = $args['currency'];
 $subscription->create();
 $uuid = isset($subscription->uuid);
 $result = Recurly_Subscription::get($uuid);
 return $result;

  

Также, пожалуйста, обратите внимание, что начиная с Recurly API версии 2.17 , теперь вы можете передавать gateway_code в качестве параметра тела для создания подписки И создания покупки, как вы изначально надеялись сделать. Вот ссылка на Примечания к выпуску Recurly API, в которых указано, когда было внесено изменение.

Комментарии:

1. Спасибо, но я пытался получить подписку с Recurly_InvoiceCollection , а не создавать подписку с нуля. Я должен также отметить, что вы все еще не можете перейти gateway_code к create_purchase — как я отметил в вопросе, мы не можем использовать create_subscription по этой причине.

2. Хорошо, не беспокойтесь. Для справки, вы можете перейти gateway_code к create_purchase , который указан в качестве предпоследнего параметра в той же ссылке, которую вы разместили в своем первоначальном вопросе. Мой ответ процитирован create_subscription , но я добавил ссылку на create_purchase для наглядности.

3. Они утверждали, что это правда, но я получил независимое подтверждение от разработчиков, что оно по-прежнему недоступно. Документация неверна.