[統一金] 訂閱付款,用戶修改預設付款方式後,還是會用初始扣款的卡片扣款
j7-dev opened this issue · comments
JerryLiu commented
說明
訂閱付款,用戶修改預設付款方式後,還是會用初始扣款的卡片扣款
當用戶第一次付款,信用卡 hash 應該就被儲存在訂單內,之後的訂單都會複製第一筆訂單的資料
問題點
當用戶 修改預設付款方式 時,並不會修改第一筆訂單的資訊
因此 WCS 之後複製訂單時,還是一直複製到最一開始的 信用卡 hash
JerryLiu commented
可能有幫助的資訊
- 這個 action
woocommerce_payment_token_set_default
在 用戶更換預設 付款方式時觸發
-
WC_Payment_Tokens 這個 WC 的 class 有許多靜態方法
-
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
)
JerryLiu commented
解法
\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();
}
}