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

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

Но Создать покупку возвращает сбор счетов. Это можно разобрать, чтобы найти только что созданный объект $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;

}

person Isaac Lubow    schedule 22.03.2019    source источник


Ответы (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;

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

person Ben Hulan    schedule 02.05.2019
comment
Спасибо, но я пытался получить подписку от Recurly_InvoiceCollection, а не создавать подписку с нуля. Я также должен отметить, что вы по-прежнему не можете передать gateway_code в create_purchase - как я уже отмечал в вопросе, по этой причине мы не можем использовать create_subscription. - person Isaac Lubow; 13.06.2019
comment
Хорошо, не волнуйтесь. Для записи вы можете передать gateway_code в create_purchase, который указан как предпоследний параметр в той же ссылке, которую вы разместили в исходном вопросе. В моем ответе процитировано create_subscription, но я добавил ссылку на create_purchase для ясности. - person Ben Hulan; 13.06.2019
comment
Они утверждали, что это правда, но я получил независимое подтверждение от разработчиков, что это все еще недоступно. Документация неверна. - person Isaac Lubow; 17.06.2019