ข้ามไปยังเนื้อหาหลัก

ไลบรารี่ Ruby (omise-ruby)

omise-ruby gem มอบอินเทอร์เฟส Ruby ที่ครอบคลุมสำหรับ Omise API พร้อมการรวม Rails ที่ยอดเยี่ยม โค้ด Ruby ตามหลักสำนวน และการจัดการข้อผิดพลาดที่แข็งแกร่ง

การติดตั้ง

การใช้ Bundler (แนะนำ)

เพิ่มลงใน Gemfile ของคุณ:

gem 'omise', '~> 0.11.0'

จากนั้นรัน:

bundle install

การใช้ RubyGems

gem install omise

ข้อกำหนด

  • Ruby 2.6 หรือสูงกว่า (รวมถึง Ruby 3.x)
  • Bundler (สำหรับแอปพลิเคชัน Rails)
  • การเชื่อมต่ออินเทอร์เน็ตที่ใช้งานได้สำหรับการเรียก API

เริ่มต้นอย่างรวดเร็ว

การกำหนดค่าพื้นฐาน

require 'omise'

# กำหนดค่าด้วย API keys ของคุณ
Omise.api_key = 'skey_test_123456789'
Omise.api_version = '2019-05-29'

# ตัวเลือก: ตั้งค่า API endpoint (สำหรับการทดสอบ)
# Omise.api_url = 'https://api.omise.co'

การกำหนดค่า Rails

สร้าง initializer ที่ config/initializers/omise.rb:

# config/initializers/omise.rb
Omise.api_key = ENV['OMISE_SECRET_KEY']
Omise.api_version = '2019-05-29'

# กำหนดค่า timeout (ตัวเลือก)
Omise.timeout = 30 # วินาที

# เปิดใช้งานโหมดดีบักในการพัฒนา
Omise.debug = Rails.env.development?

ตัวแปรสภาพแวดล้อม

เพิ่มลงในไฟล์ .env ของคุณ:

# การพัฒนา/ทดสอบ
OMISE_SECRET_KEY=skey_test_123456789
OMISE_PUBLIC_KEY=pkey_test_123456789

# ผลิตภาพ
# OMISE_SECRET_KEY=skey_live_123456789
# OMISE_PUBLIC_KEY=pkey_live_123456789

การตรวจสอบสิทธิ์

ไลบรารี่ใช้ secret key ของคุณสำหรับการดำเนินการ API ทั้งหมด:

# ตัวเลือก 1: การกำหนดค่าแบบทั่วโลก (แนะนำ)
Omise.api_key = ENV['OMISE_SECRET_KEY']

# ตัวเลือก 2: การกำหนดค่าต่อคำขอ
charge = Omise::Charge.retrieve('chrg_test_123', key: 'skey_test_alternate')

การดำเนินการทั่วไป

การสร้างค่าธรรมเนียม

ด้วย Token

# สร้างค่าธรรมเนียมด้วยโทเคนบัตร
charge = Omise::Charge.create(
amount: 100_000, # 1,000.00 THB (in smallest currency unit)
currency: 'THB',
card: 'tokn_test_123',
description: 'Order #1234',
metadata: {
order_id: '1234',
customer_name: 'John Doe'
}
)

if charge.paid
puts "Charge successful: #{charge.id}"
else
puts "Charge failed: #{charge.failure_message}"
end

ด้วยลูกค้า

# สร้างค่าธรรมเนียมสำหรับลูกค้าที่มีอยู่
charge = Omise::Charge.create(
amount: 50_000,
currency: 'THB',
customer: 'cust_test_123',
description: 'Subscription payment'
)

ด้วย 3D Secure

# สร้างค่าธรรมเนียมที่อาจต้องใช้ 3D Secure
charge = Omise::Charge.create(
amount: 100_000,
currency: 'THB',
card: 'tokn_test_123',
return_uri: 'https://example.com/payment/callback'
)

if charge.authorized
if charge.authorize_uri
# เปลี่ยนเส้นทางลูกค้าไปยัง authorize_uri สำหรับ 3D Secure
redirect_to charge.authorize_uri
else
# เรียกเก็บเงินเสร็จสมบูรณ์โดยไม่ต้องใช้ 3D Secure
process_successful_payment(charge)
end
end

การดึงค่าธรรมเนียม

# ดึงค่าธรรมเนียมตาม ID
charge = Omise::Charge.retrieve('chrg_test_123')

puts "Amount: #{charge.amount}"
puts "Currency: #{charge.currency}"
puts "Status: #{charge.status}"
puts "Paid: #{charge.paid}"

การแสดงรายชื่อค่าธรรมเนียม

# แสดงรายการค่าธรรมเนียมทั้งหมดพร้อมการแบ่งหน้า
charges = Omise::Charge.list(
limit: 20,
offset: 0,
order: 'reverse_chronological'
)

charges.each do |charge|
puts "#{charge.id}: #{charge.amount} #{charge.currency}"
end

# แสดงรายการค่าธรรมเนียมพร้อมตัวกรอง
recent_charges = Omise::Charge.list(
from: 1.week.ago.to_date.iso8601,
to: Date.today.iso8601
)

การสร้างลูกค้า

# สร้างลูกค้าโดยไม่มีบัตร
customer = Omise::Customer.create(
email: 'customer@example.com',
description: 'John Doe',
metadata: {
user_id: '12345',
account_type: 'premium'
}
)

puts "Customer created: #{customer.id}"

การบันทึกบัตรเข้าไปในลูกค้า

# อัปเดตลูกค้าด้วยโทเคนบัตร
customer = Omise::Customer.retrieve('cust_test_123')
customer.update(card: 'tokn_test_456')

puts "Card saved: #{customer.default_card}"

# หรือสร้างลูกค้าพร้อมบัตรในขั้นตอนเดียว
customer = Omise::Customer.create(
email: 'customer@example.com',
description: 'John Doe',
card: 'tokn_test_123'
)

การแสดงรายชื่อบัตรลูกค้า

customer = Omise::Customer.retrieve('cust_test_123')

customer.cards.each do |card|
puts "#{card.brand} ending in #{card.last_digits}"
puts "Expires: #{card.expiration_month}/#{card.expiration_year}"
end

การสร้างการคืนเงิน

# คืนเงินเต็มจำนวน
refund = Omise::Refund.create(
charge: 'chrg_test_123',
amount: nil # nil สำหรับคืนเงินเต็มจำนวน
)

# คืนเงินบางส่วน
refund = Omise::Refund.create(
charge: 'chrg_test_123',
amount: 25_000, # 250.00 THB
metadata: {
reason: 'customer_request',
ticket_id: 'TICKET-123'
}
)

puts "Refund #{refund.id}: #{refund.amount} #{refund.currency}"

การสร้างการโอน

# สร้างการโอนไปยังบัญชีธนาคารของคุณ
transfer = Omise::Transfer.create(
amount: 500_000, # 5,000.00 THB
recipient: 'recp_test_123',
metadata: {
payout_id: 'PAYOUT-456'
}
)

puts "Transfer #{transfer.id}: #{transfer.amount}"

วิธีการชำระเงินแบบอื่น

การสร้างแหล่งที่มา

# QR PromptPay
source = Omise::Source.create(
type: 'promptpay',
amount: 100_000,
currency: 'THB'
)

# แสดง QR code ให้กับลูกค้า
puts "QR Code URL: #{source.scannable_code.image.download_uri}"

# สร้างค่าธรรมเนียมด้วยแหล่งที่มา
charge = Omise::Charge.create(
amount: 100_000,
currency: 'THB',
source: source.id,
return_uri: 'https://example.com/payment/callback'
)

ธนาคารอินเทอร์เน็ต

# ธนาคารอินเทอร์เน็ต
source = Omise::Source.create(
type: 'internet_banking_scb',
amount: 100_000,
currency: 'THB'
)

charge = Omise::Charge.create(
amount: 100_000,
currency: 'THB',
source: source.id,
return_uri: 'https://example.com/payment/callback'
)

# เปลี่ยนเส้นทางลูกค้าไปยัง authorize_uri
redirect_to charge.authorize_uri

Mobile Banking

# Mobile Banking (SCB Easy)
source = Omise::Source.create(
type: 'mobile_banking_scb',
amount: 100_000,
currency: 'THB'
)

charge = Omise::Charge.create(
amount: 100_000,
currency: 'THB',
source: source.id,
return_uri: 'https://example.com/payment/callback'
)

การผ่อนชำระ

# การชำระแบบผ่อน
source = Omise::Source.create(
type: 'installment_kbank',
amount: 100_000,
currency: 'THB',
installment_term: 6 # 6 เดือน
)

charge = Omise::Charge.create(
amount: 100_000,
currency: 'THB',
source: source.id,
return_uri: 'https://example.com/payment/callback'
)

การจัดการข้อผิดพลาด

ไลบรารี่จะโยนข้อยกเว้นประเภทเฉพาะสำหรับข้อผิดพลาดที่แตกต่างกัน:

begin
charge = Omise::Charge.create(
amount: 100_000,
currency: 'THB',
card: 'tokn_test_123'
)
rescue Omise::AuthenticationError => e
# API key ไม่ถูกต้อง
puts "การตรวจสอบสิทธิ์ล้มเหลว: #{e.message}"

rescue Omise::InvalidRequestError => e
# พารามิเตอร์ไม่ถูกต้อง
puts "คำขอไม่ถูกต้อง: #{e.message}"
puts "รหัสสถานะ: #{e.http_status}"

rescue Omise::CardError => e
# บัตรถูกปฏิเสธ
puts "ข้อผิดพลาดบัตร: #{e.message}"
puts "รหัสความล้มเหลว: #{e.code}"

rescue Omise::APIError => e
# ข้อผิดพลาด API ทั่วไป
puts "ข้อผิดพลาด API: #{e.message}"

rescue Omise::ConnectionError => e
# ข้อผิดพลาดเครือข่าย
puts "การเชื่อมต่อล้มเหลว: #{e.message}"

rescue Omise::Error => e
# รองรับข้อผิดพลาด Omise ทั้งหมด
puts "ข้อผิดพลาด Omise: #{e.message}"
end

การจัดการข้อผิดพลาดบัตรเฉพาะ

begin
charge = Omise::Charge.create(amount: 100_000, currency: 'THB', card: token)

rescue Omise::CardError => e
case e.code
when 'insufficient_fund'
flash[:error] = 'เงินในบัตรไม่เพียงพอ'
when 'stolen_or_lost_card'
flash[:error] = 'บัตรถูกรายงานว่าถูกขโมยหรือสูญหาย'
when 'invalid_security_code'
flash[:error] = 'รหัส CVV ไม่ถูกต้อง'
when 'payment_cancelled'
flash[:error] = 'การชำระเงินถูกยกเลิก'
else
flash[:error] = "ข้อผิดพลาดบัตร: #{e.message}"
end

redirect_to payment_path
end

การรวม Rails

ตัวอย่างตัวควบคุม

# app/controllers/payments_controller.rb
class PaymentsController < ApplicationController
def create
@order = Order.find(params[:order_id])

charge = Omise::Charge.create(
amount: (@order.total * 100).to_i, # แปลงเป็นหน่วยที่เล็กที่สุด
currency: 'THB',
card: params[:omise_token],
description: "Order ##{@order.id}",
metadata: {
order_id: @order.id,
customer_email: @order.email
},
return_uri: payment_callback_url
)

if charge.paid
@order.update!(
payment_status: 'paid',
charge_id: charge.id
)
redirect_to order_path(@order), notice: 'การชำระเงินสำเร็จ!'
elsif charge.authorize_uri
# ต้องใช้ 3D Secure
redirect_to charge.authorize_uri
else
flash[:error] = charge.failure_message
render :new
end

rescue Omise::Error => e
Rails.logger.error "ข้อผิดพลาด Omise: #{e.message}"
flash[:error] = 'การชำระเงินล้มเหลว กรุณาลองอีกครั้ง'
render :new
end

def callback
charge = Omise::Charge.retrieve(params[:id])
@order = Order.find_by(charge_id: charge.id)

if charge.paid
@order.update!(payment_status: 'paid')
redirect_to order_path(@order), notice: 'การชำระเงินสำเร็จ!'
else
flash[:error] = charge.failure_message
redirect_to new_payment_path(order_id: @order.id)
end
end
end

การรวม Model

# app/models/payment.rb
class Payment < ApplicationRecord
belongs_to :order

validates :amount, presence: true, numericality: { greater_than: 0 }
validates :currency, presence: true

# สร้างค่าธรรมเนียม
def charge!(token)
charge = Omise::Charge.create(
amount: (amount * 100).to_i,
currency: currency,
card: token,
description: "Order ##{order.id}",
metadata: charge_metadata
)

update!(
charge_id: charge.id,
status: charge.status,
paid: charge.paid
)

charge
end

# คืนเงินค่าธรรมเนียม
def refund!(refund_amount = nil)
refund = Omise::Refund.create(
charge: charge_id,
amount: refund_amount ? (refund_amount * 100).to_i : nil
)

update!(
refund_id: refund.id,
refund_amount: refund.amount / 100.0,
status: 'refunded'
)

refund
end

# รีเฟรชสถานะค่าธรรมเนียม
def refresh_status!
charge = Omise::Charge.retrieve(charge_id)
update!(
status: charge.status,
paid: charge.paid,
failure_code: charge.failure_code,
failure_message: charge.failure_message
)
end

private

def charge_metadata
{
order_id: order.id,
customer_email: order.email,
customer_name: order.customer_name
}
end
end

Background Job สำหรับการประมวลผลค่าธรรมเนียม

# app/jobs/process_charge_job.rb
class ProcessChargeJob < ApplicationJob
queue_as :payments

retry_on Omise::ConnectionError, wait: :exponentially_longer, attempts: 5
discard_on Omise::AuthenticationError

def perform(payment_id, token)
payment = Payment.find(payment_id)

charge = payment.charge!(token)

if charge.paid
OrderMailer.payment_confirmed(payment.order).deliver_later
else
OrderMailer.payment_failed(payment.order, charge.failure_message).deliver_later
end

rescue Omise::CardError => e
payment.update!(
status: 'failed',
failure_message: e.message
)
OrderMailer.payment_failed(payment.order, e.message).deliver_later
end
end

แนวทางปฏิบัติที่ดีที่สุด

1. ใช้ตัวแปรสภาพแวดล้อมสำหรับ Keys

# config/initializers/omise.rb
Omise.api_key = ENV.fetch('OMISE_SECRET_KEY') do
raise 'ไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อม OMISE_SECRET_KEY'
end

# ห้ามคอมมิต keys เข้าสู่ระบบควบคุมเวอร์ชัน
# เพิ่มไปยัง .gitignore:
# .env
# .env.local

2. จัดการ Idempotency

# ใช้ idempotency key สำหรับการสร้างค่าธรรมเนียม
charge = Omise::Charge.create(
amount: 100_000,
currency: 'THB',
card: token,
headers: {
'Idempotency-Key' => "order-#{order.id}-#{Time.now.to_i}"
}
)

3. ใช้ Background Jobs สำหรับการเรียก API

# ประมวลผลค่าธรรมเนียมแบบอะซิงโครนัส
class ChargeCustomerJob < ApplicationJob
queue_as :payments

def perform(customer_id, amount)
customer = Customer.find(customer_id)

charge = Omise::Charge.create(
amount: (amount * 100).to_i,
currency: 'THB',
customer: customer.omise_customer_id
)

# ประมวลผลผลลัพธ์
rescue Omise::Error => e
# จัดการข้อผิดพลาด
end
end

4. เก็บข้อมูลขั้นต่ำ

# เก็บเฉพาะ ID ไม่ใช่อออบเจ็กต์ทั้งหมด
class Order < ApplicationRecord
# ดี: เก็บเฉพาะ ID
def create_charge(token)
charge = Omise::Charge.create(...)
update!(charge_id: charge.id)
end

# ดี: ดึงข้อมูลเมื่อต้องการ
def charge
@charge ||= Omise::Charge.retrieve(charge_id) if charge_id
end
end

5. ตรวจสอบความถูกต้องก่อนเรียก API

class Payment < ApplicationRecord
validates :amount, numericality: { greater_than: 2000 } # ขั้นต่ำ 20 THB
validates :currency, inclusion: { in: %w[THB USD] }

def charge!(token)
raise 'การชำระเงินไม่ถูกต้อง' unless valid?

Omise::Charge.create(
amount: (amount * 100).to_i,
currency: currency,
card: token
)
end
end

6. การกำหนดค่าโหมดทดสอบ

# config/environments/test.rb
Rails.application.configure do
config.after_initialize do
Omise.api_key = 'skey_test_123456789'
end
end

# Stub การเรียก API ในการทดสอบ
RSpec.describe Payment do
before do
allow(Omise::Charge).to receive(:create).and_return(
double(id: 'chrg_test_123', paid: true)
)
end
end

การทดสอบ

ตัวอย่าง RSpec

# spec/models/payment_spec.rb
require 'rails_helper'

RSpec.describe Payment, type: :model do
let(:payment) { create(:payment, amount: 1000) }

describe '#charge!' do
context 'ด้วยโทเคนที่ถูกต้อง' do
let(:charge) do
double(
id: 'chrg_test_123',
paid: true,
status: 'successful'
)
end

before do
allow(Omise::Charge).to receive(:create).and_return(charge)
end

it 'สร้างค่าธรรมเนียม' do
expect(Omise::Charge).to receive(:create).with(
hash_including(
amount: 100_000,
currency: 'THB'
)
)

payment.charge!('tokn_test_123')
end

it 'อัปเดตการชำระเงินด้วย charge ID' do
payment.charge!('tokn_test_123')
expect(payment.charge_id).to eq('chrg_test_123')
expect(payment.paid).to be true
end
end

context 'ด้วยข้อผิดพลาดบัตร' do
before do
allow(Omise::Charge).to receive(:create).and_raise(
Omise::CardError.new('insufficient_fund', 'เงินไม่เพียงพอ')
)
end

it 'โยน CardError' do
expect { payment.charge!('tokn_test_123') }.to raise_error(Omise::CardError)
end
end
end
end

VCR สำหรับการทดสอบ API

# spec/spec_helper.rb
require 'vcr'

VCR.configure do |config|
config.cassette_library_dir = 'spec/vcr_cassettes'
config.hook_into :webmock
config.filter_sensitive_data('<OMISE_SECRET_KEY>') { ENV['OMISE_SECRET_KEY'] }
config.filter_sensitive_data('<OMISE_PUBLIC_KEY>') { ENV['OMISE_PUBLIC_KEY'] }
end

# spec/integration/charge_spec.rb
RSpec.describe 'การสร้างค่าธรรมเนียม' do
it 'สร้างค่าธรรมเนียมสำเร็จ', :vcr do
charge = Omise::Charge.create(
amount: 100_000,
currency: 'THB',
card: 'tokn_test_123'
)

expect(charge.paid).to be true
end
end

การ Mock ด้วย WebMock

# spec/support/omise_stubs.rb
module OmiseStubs
def stub_charge_create(paid: true, amount: 100_000)
stub_request(:post, 'https://api.omise.co/charges')
.to_return(
status: 200,
body: {
object: 'charge',
id: 'chrg_test_123',
amount: amount,
currency: 'THB',
paid: paid
}.to_json,
headers: { 'Content-Type' => 'application/json' }
)
end
end

RSpec.configure do |config|
config.include OmiseStubs
end

# การใช้งานใน specs
RSpec.describe PaymentsController do
describe 'POST #create' do
before { stub_charge_create(paid: true) }

it 'สร้างค่าธรรมเนียม' do
post :create, params: { token: 'tokn_test_123', amount: 1000 }
expect(response).to redirect_to(success_path)
end
end
end

การแก้ไขปัญหา

ข้อผิดพลาดใบรับรอง SSL

# หากคุณพบข้อผิดพลาด SSL ในการพัฒนา
Omise.ssl_verify = false # เฉพาะสำหรับการพัฒนา/ทดสอบเท่านั้น!

# ดีกว่า: อัปเดตใบรับรอง CA
# บน macOS ด้วย Homebrew:
# brew install curl-ca-bundle

# บน Ubuntu/Debian:
# apt-get install ca-certificates

หมดเวลาการเชื่อมต่อ

# เพิ่ม timeout สำหรับการเชื่อมต่อที่ช้า
Omise.timeout = 60 # วินาที

# หรือต่อคำขอ
charge = Omise::Charge.create(
amount: 100_000,
currency: 'THB',
card: token,
timeout: 60
)

โหมดดีบัก

# เปิดใช้งานการบันทึกดีบัก
Omise.debug = true

# สิ่งนี้จะแสดงผล:
# - URL และเมธอดคำขอ
# - ส่วนหัวคำขอ
# - เนื้อหาคำขอ
# - สถานะการตอบกลับ
# - เนื้อหาการตอบกลับ

การตรวจสอบลายเซ็นเว็บฮุก

# ตรวจสอบลายเซ็นเว็บฮุก
def verify_webhook_signature
payload = request.body.read
signature = request.headers['Omise-Signature']

expected_signature = OpenSSL::HMAC.hexdigest(
'sha256',
ENV['OMISE_WEBHOOK_SECRET'],
payload
)

unless Rack::Utils.secure_compare(signature, expected_signature)
render json: { error: 'ลายเซ็นไม่ถูกต้อง' }, status: :unauthorized
end
end

คำถามที่พบบ่อย

ฉันจะจัดการ webhooks ใน Rails ได้อย่างไร?

# config/routes.rb
post '/webhooks/omise', to: 'webhooks#omise'

# app/controllers/webhooks_controller.rb
class WebhooksController < ApplicationController
skip_before_action :verify_authenticity_token

def omise
event = JSON.parse(request.body.read)

case event['key']
when 'charge.complete'
handle_charge_complete(event['data'])
when 'refund.create'
handle_refund_create(event['data'])
end

head :ok
end

private

def handle_charge_complete(charge_data)
charge = Omise::Charge.retrieve(charge_data['id'])
payment = Payment.find_by(charge_id: charge.id)
payment.update!(paid: charge.paid, status: charge.status)
end
end

ฉันจะทดสอบกระบวนการชำระเงินโดยไม่มีค่าใช้จ่ายจริงได้อย่างไร?

# ใช้ test API keys
Omise.api_key = 'skey_test_123456789'

# ใช้โทเคนบัตรทดสอบ
# สำเร็จ: tokn_test_5086xl7ddjbases4sq3i
# ถูกปฏิเสธ: tokn_test_no1

# ตรวจสอบโหมดทดสอบ
charge = Omise::Charge.create(...)
puts "โหมดทดสอบ: #{charge.livemode == false}"

ฉันจะจัดการการแปลงสกุลเงินได้อย่างไร?

# เก็บจำนวนเงินในหน่วยสกุลเงินที่เล็กที่สุด
class Payment < ApplicationRecord
# amount เก็บในฐานข้อมูลเป็น integer (สตางค์/เซนต์)

def amount_baht
amount / 100.0
end

def amount_baht=(value)
self.amount = (value.to_f * 100).to_i
end
end

# การใช้งาน
payment = Payment.new(amount_baht: 1000.00) # 1000.00 THB
payment.amount # => 100000 (ในสตางค์)

ฉันจะใช้งาน retry logic ได้อย่างไร?

# ใช้ exponential backoff
def create_charge_with_retry(params, max_retries: 3)
retries = 0

begin
Omise::Charge.create(params)
rescue Omise::ConnectionError => e
retries += 1
if retries <= max_retries
sleep(2 ** retries) # 2, 4, 8 วินาที
retry
else
raise
end
end
end

# หรือใช้ ActiveJob กับ retry
class ChargeJob < ApplicationJob
retry_on Omise::ConnectionError, wait: :exponentially_longer, attempts: 5

def perform(params)
Omise::Charge.create(params)
end
end

ฉันจะจัดการการคืนเงินบางส่วนได้อย่างไร?

charge = Omise::Charge.retrieve('chrg_test_123')

# ตรวจสอบจำนวนเงินที่สามารถคืนได้
refundable = charge.amount - charge.refunded

# สร้างการคืนเงินบางส่วน
if refundable >= 25_000
refund = Omise::Refund.create(
charge: charge.id,
amount: 25_000
)
end

# ตรวจสอบว่าคืนเงินทั้งหมดแล้วหรือไม่
charge.reload
puts "คืนเงินทั้งหมด: #{charge.refunded == charge.amount}"

ฉันจะบันทึกบัตรหลายใบสำหรับลูกค้าได้อย่างไร?

customer = Omise::Customer.retrieve('cust_test_123')

# เพิ่มบัตรแรก
customer.update(card: 'tokn_test_111')

# เพิ่มบัตรที่สอง (แทนที่บัตรเริ่มต้น)
customer.update(card: 'tokn_test_222')

# แสดงรายการบัตรทั้งหมด
customer.cards.each do |card|
puts "#{card.id}: #{card.brand} #{card.last_digits}"
end

# เรียกเก็บเงินจากบัตรเฉพาะ
Omise::Charge.create(
amount: 100_000,
currency: 'THB',
customer: customer.id,
card: 'card_test_111' # ID บัตรเฉพาะ
)

ฉันจะใช้งานการเรียกเก็บเงินแบบสมาชิกได้อย่างไร?

# สร้างลูกค้าพร้อมบัตร
customer = Omise::Customer.create(
email: 'customer@example.com',
card: token
)

# เรียกเก็บเงินรายเดือน
def charge_subscription(customer_id, plan_amount)
charge = Omise::Charge.create(
amount: (plan_amount * 100).to_i,
currency: 'THB',
customer: customer_id,
description: "การสมัครสมาชิก #{Date.today.strftime('%B %Y')}"
)

if charge.paid
# อัปเดตสถานะการสมัครสมาชิก
else
# จัดการการชำระเงินที่ล้มเหลว
end
end

# กำหนดเวลาด้วย whenever gem หรือ cron
# หรือใช้ Sidekiq scheduler
class SubscriptionChargeJob < ApplicationJob
def perform
Subscription.active.find_each do |subscription|
charge_subscription(subscription.customer_id, subscription.amount)
end
end
end

ทรัพยากรที่เกี่ยวข้อง

ขั้นตอนถัดไป

การสนับสนุน

หากคุณพบปัญหากับไลบรารี่ Ruby:

  1. ตรวจสอบ ปัญหา GitHub
  2. ตรวจสอบ เอกสาร API
  3. ติดต่อ support@omise.co พร้อม:
    • เวอร์ชัน Ruby
    • เวอร์ชัน omise-ruby gem
    • ข้อความข้อผิดพลาดและ stack trace
    • ขั้นตอนในการสร้างซ้ำ