j7-dev/woomp

[統一金] 訂閱付款,用戶修改預設付款方式後,還是會用初始扣款的卡片扣款

Closed this issue · 3 comments

說明

訂閱付款,用戶修改預設付款方式後,還是會用初始扣款的卡片扣款

當用戶第一次付款,信用卡 hash 應該就被儲存在訂單內,之後的訂單都會複製第一筆訂單的資料

問題點

當用戶 修改預設付款方式 時,並不會修改第一筆訂單的資訊

因此 WCS 之後複製訂單時,還是一直複製到最一開始的 信用卡 hash

可能有幫助的資訊

  1. 這個 action woocommerce_payment_token_set_default 在 用戶更換預設 付款方式時觸發

image

  1. WC_Payment_Tokens 這個 WC 的 class 有許多靜態方法

  2. WC_Payment_Tokens::get_customer_tokens( $user_id ); 可以拿到用戶身上的所有 token 物件

My Account > 新增付款方式 新增訂閱信用卡的 responce $data

[data] => Array
        (
            [Status] => SUCCESS
            [Message] => 授權成功
            [MerID] => NPPA52270000
            [MerTradeNo] => 1706130000
            [Gateway] => 1
            [TradeNo] => 1706131740809700000
            [TradeAmt] => 5
            [TradeStatus] => 1
            [PaymentType] => 1
            [CardBank] => 013
            [Card6No] => 402000
            [Card4No] => 5000
            [CardInst] => 1
            [FirstAmt] => 5
            [EachAmt] => 0
            [ResCode] => 0
            [ResCodeMsg] => 授權成功
            [AuthCode] => 180001
            [AuthBank] => 822
            [AuthBankName] => 中國信託商業銀行
            [AuthType] => 1
            [AuthDay] => 20240100
            [AuthTime] => 052000
            [CreditHash] => B6C***0C57A40000C***F000008D6B7000000000293
            [CreditLife] => 0000
        )

解法

\add_action('woocommerce_payment_token_set_default', array($class, 'update_credit_hash'), 30, 2);

public function update_credit_hash(int $token_id, \WC_PAYMENT_TOKEN_CC $token): void
{
if (!class_exists('WC_Subscriptions')) return;

$user_id = get_current_user_id();
if (!$user_id) return;
// find all subscriptions for this user
$subscriptions = wcs_get_users_subscriptions($user_id);
// get subscription post parent id
$parent_order_ids = [];
foreach ($subscriptions as $subscription) {
	$subscription_id = $subscription->get_id();
	$parent_id = wp_get_post_parent_id($subscription_id);
	$parent_order_ids[] = $parent_id;
}

foreach ($parent_order_ids as $order_id) {
	$order = wc_get_order($order_id);
	if (!$order) continue;
	$order->update_meta_data('_payuni_card_hash', $token->get_token());
	$order->update_meta_data('_payuni_card_number', $token->get_last4());

	//	_payuni_resp_card_bank  	_payuni_resp_trade_no 	_payuni_resp_message _payuni_resp_status
	$order->save();
}
}

2024/04/16 更新

後來討論,用戶換卡的行為到底應該如何處理,結論如下

  1. 訂閱扣款的信用卡,不隨著用戶變更預設付款方式改變
    始終是跟著 第一筆訂單的付款方式走
  2. 新增一個介面 讓ADMIN可以在訂閱介面,調整後續訂閱要刷的卡片
  3. 如果有 #37 的問題,就讓客戶自己去跟 ADMIN 反映,讓 ADMIN 手動幫客戶調整
  4. revert (撤銷) #37 的變更代碼