# การชำระเงิน
โมดูลการชำระเงินให้บริการการซื้อไอเท็มในเกมและการซื้อเกมแบบซื้อขาด หลังจากอ่านส่วนที่เกี่ยวข้องกับเอนจินเกมของคุณในหน้า [`JOGOS_SDK แนะนำ`](./introduction.md) แล้ว สามารถใช้งานฟังก์ชันดังต่อไปนี้ได้:
::: tabs key:engine
== HTML5
```javascript
window.JOGOS_SDK.payment;== Cocos
JOGOS_SDK.payment;== Unity
JogosSDK.Goods:::
การซื้อในแอป (In-App Purchase)
ขั้นตอนที่ 1: สร้างสินค้า ID
- สร้างสินค้าในหน้า Information / Purchase ของแดชบอร์ดนักพัฒนา
- โปรดทราบว่า สินค้า ID ในเกมเดียวกันต้องไม่ซ้ำกัน
ขั้นตอนที่ 2: สร้างคำสั่งซื้อ
- เมื่อผู้เล่นต้องการซื้อไอเท็มในเกม ให้เรียกใช้อินเทอร์เฟซนี้บนปุ่มซื้อสินค้า เพื่อเปิดหน้าต่างการชำระเงินของ Jogos
- นักพัฒนาต้องส่งค่า goodsId ซึ่งเป็นสินค้า ID ที่สร้างไว้ในแดชบอร์ด
- เมื่อเปิดหน้าต่างการชำระเงินสำเร็จ ระบบจะส่งคืนหมายเลขคำสั่งซื้อ (orderNo) นักพัฒนาสามารถใช้หมายเลขนี้เพื่อตรวจสอบข้อมูลของคำสั่งซื้อภายหลังได้
::: tabs key:engine
== HTML5
// ส่งคืนหมายเลขคำสั่งซื้อสำเร็จ
let orderNo = await window.JOGOS_SDK.payment.buyGoods(goodsId: string);== Cocos
// ส่งคืนหมายเลขคำสั่งซื้อสำเร็จ
let orderNo = await JogosSDK.Game.buyGoods(goodsId: string);== Unity
//การสั่งซื้อสำเร็จ แต่ยังไม่ใช่การชำระเงินเสร็จสิ้น
JogosSDK.Goods.BuyGoods(goodsId, (orderNo, goodsId) =>
{
// คอลแบ็กการสั่งซื้อสำเร็จ โปรดทราบว่านี่ยังไม่ใช่การชำระเงินเสร็จสิ้น
// การชำระเงินเสร็จสิ้นจะถูกแจ้งผ่าน SubscribeOrderPaid
// สามารถตรวจสอบสถานะคำสั่งซื้อได้ด้วย orderId
});:::
ขั้นตอนที่ 3: รอให้ผู้ใช้ทำการชำระเงิน
การสมัครรับการแจ้งเตือนการชำระเงินเสร็จสิ้นจากฝั่งไคลเอนต์
การสั่งซื้อของผู้เล่นไปจนถึงการชำระเงินสำเร็จอาจใช้เวลานาน ผู้พัฒนาสามารถใช้อินเทอร์เฟซนี้เพื่อสมัครรับข้อความการชำระเงินสำเร็จของผู้เล่น (การเรียกหลังการเริ่มต้น) เมื่อผู้เล่นชำระเงินสำเร็จ แพลตฟอร์มจะแจ้งให้ผู้พัฒนาทราบผ่านการเรียกกลับว่าการสั่งซื้อเสร็จสมบูรณ์แล้วและส่งข้อมูลการสั่งซื้อล่าสุด
::: tabs key:engine
== HTML5
window.JOGOS_SDK.payment.subscribeOrderPaid(callbackFn: (order: PaymentOrder) => void);== Cocos
JogosSDK.Game.subscribeOrderPaid(callbackFn: (order: PaymentOrder) => void);== Unity
// ต้องเรียกใช้หลังจาก SDK ถูก initialize แล้ว
JogosSDK.Goods.SubscribeOrderPaid((orderInfo) =>
{
// คอลแบ็กเมื่อการชำระเงินสำเร็จ goodsId คือ sku ที่กำหนดในแดชบอร์ด
_TODO_(orderInfo.goodsId);
}, (errorMsg) =>
{
// คอลแบ็กเมื่อการชำระเงินล้มเหลว
Debug.Log("Buy goods error:" + errorMsg);
},
true // กำหนดว่าจะส่งสินค้าอัตโนมัติหรือไม่
// true = หลังจากการชำระเงินเสร็จสิ้น ระบบจะตั้งสถานะเป็น "จัดส่งแล้ว"
// หากเป็น false ต้องเรียก JogosSDK.Goods.DeliverGoods(orderInfo.orderNo) เพื่อตั้งสถานะเป็นจัดส่ง
);:::
ขั้นตอนที่ 4: จัดส่งสินค้า และแจ้งแพลตฟอร์มว่าคำสั่งซื้อนี้ถูกจัดส่งแล้ว
การจัดส่งจากฝั่งไคลเอนต์ (เกมออฟไลน์)
เมื่อนักพัฒนาทราบว่าผู้เล่นชำระเงินสำเร็จ ให้ดำเนินการมอบรางวัลอัตโนมัติ และเรียก API นี้เพื่อแจ้งแพลตฟอร์มว่าการจัดส่งเสร็จสิ้นแล้ว
::: tabs key:engine
== HTML5
await window.JOGOS_SDK.payment.deliverGoods(orderNo: string);== Cocos
await JogosSDK.Game.deliverGoods(orderNo: string);== Unity
// ตั้งค่าคำสั่งซื้อเป็นสถานะ "จัดส่งแล้ว"
JogosSDK.Goods.DeliverGoods(orderNo);:::
สำหรับการเชื่อมต่อจากฝั่ง "เกมเซิร์ฟเวอร์":
สำหรับ API ที่เกี่ยวข้องกับเซิร์ฟเวอร์ โปรดดูที่หน้า Server API
อินเทอร์เฟซอื่น ๆ
ข้อมูลคำสั่งซื้อ
สามารถตรวจสอบรายละเอียดของคำสั่งซื้อด้วยหมายเลข orderNo โครงสร้างของคำสั่งซื้อมีดังนี้:
// คำสั่งซื้อการชำระเงิน
export interface PaymentOrder {
// เกม Id
gameId: number;
// ชื่อเกม
gameName: string;
// ผู้ใช้ Id
userId: number;
// หมายเลขคำสั่งซื้อ
orderNo: string;
// สินค้า Id
productId: string;
// ชื่อสินค้า
productName: string;
// สกุลเงิน
currency: string;
// ประเทศ
country: string;
// ส่วนลด
discount: number;
// หัก Jogos Coin (คะแนน)
calorcoin: number;
// จำนวนเงินที่ชำระ
paid: number;
// ช่องทางการชำระเงิน
channel: string;
// ประเภทการชำระเงิน
paymentType: string;
// หมายเลขธุรกรรมการชำระเงิน
paymentNo: string;
// สถานะการจัดส่ง
deliverGoods: boolean;
// สถานะคำสั่งซื้อ pending: รอชำระ fail: ชำระล้มเหลว cancel: ยกเลิก expire: หมดอายุ success: ชำระสำเร็จ refunding: กำลังคืนเงิน refunded: คืนเงินสำเร็จ refund-fail: คืนเงินล้มเหลว
status: 'pending' | 'fail' | 'cancel' | 'expire' | 'success' | 'refunding' | 'refunded' | 'refund-fail';
// เวลาสร้างคำสั่งซื้อ
createTime: String;
// หมายเลขการคืนเงิน
refundNo: String;
// คำอธิบายการคืนเงิน
refundDescription: String;
// เวลาที่ร้องขอการคืนเงิน
refundTime: String;
// เวลาที่คืนเงินสำเร็จ
refundedTime: String;
}ดึงข้อมูลคำสั่งซื้อ
::: tabs key:engine
== HTML5
// ส่งคืนข้อมูลคำสั่งซื้อสำเร็จ
let order = await window.JOGOS_SDK.payment.getOrderDetail(orderNo: string);== Cocos
// ส่งคืนข้อมูลคำสั่งซื้อสำเร็จ
let order = await JogosSDK.Game.getOrderDetail(orderNo: string);== Unity
// ดึงข้อมูลคำสั่งซื้อด้วยหมายเลข orderNo
JogosSDK.Goods.GetOrderInfo(orderNo, (orderInfo)=>
{
// สามารถตรวจสอบสถานะคำสั่งซื้อจาก orderInfo
});:::
ดึงรายการคำสั่งซื้อ
นักพัฒนาสามารถใช้ API นี้เพื่อค้นหารายการคำสั่งซื้อตามสถานะ และจะส่งคืนรายการคำสั่งซื้อ ข้อมูลคำสั่งซื้อจะเหมือนกับโครงสร้างรายละเอียดคำสั่งซื้อ
::: tabs key:engine
== HTML5
// ส่งคืนรายการคำสั่งซื้อสำเร็จ
let orderList = await window.JOGOS_SDK.payment.getOrderList(
status?: 'pending' | 'fail' | 'cancel' | 'expire' | 'success' | 'refunding' | 'refunded',
pageNo?: number, // หมายเลขหน้า ค่าเริ่มต้นคือ 1
pageSize?: number // จำนวนต่อหน้า ค่าเริ่มต้นคือ 20
);== Cocos
// ส่งคืนรายการคำสั่งซื้อสำเร็จ
let orderList = await JogosSDK.Game.getOrderList(
status?: 'pending' | 'fail' | 'cancel' | 'expire' | 'success' | 'refunding' | 'refunded',
pageNo?: number, // หมายเลขหน้า ค่าเริ่มต้นคือ 1
pageSize?: number // จำนวนต่อหน้า ค่าเริ่มต้นคือ 20
);== Unity
// ดึงรายการคำสั่งซื้อด้วยสถานะคำสั่งซื้อ ใช้ระบบแบ่งหน้า: หมายเลขหน้า จำนวนต่อหน้า
JogosSDK.Goods.GetOrderList(status, pageNum, pageSize, (orderList) =>
{
// ส่งคืนคำสั่งซื้อทั้งหมดในสถานะเดียวกัน
});:::
เกมแบบซื้อขาด (Buy-Out Game)
- ตั้งค่าเกมของคุณในแดชบอร์ดเป็นประเภท “Game Pricing” (เกมแบบซื้อขาด) และกำหนดราคา
- สร้างเวอร์ชันของเกมสองแบบ: รุ่นทดลอง และรุ่นเต็ม
- รุ่นทดลอง: แนะนำให้ตัดทรัพยากร เช่น ด่าน โมเดล เท็กซ์เจอร์ เพลง ที่ผู้เล่นไม่สามารถเข้าถึงออกไป และเก็บเฉพาะคอนเทนต์ที่สามารถเล่นได้เท่านั้น แล้วทำการอัปโหลดแพ็กเกจนี้
- รุ่นเต็ม: เวอร์ชันที่มีคอนเทนต์ทั้งหมดของเกมให้ผู้เล่นเข้าถึง
- ตั้งค่าปุ่มซื้อภายในรุ่นทดลอง:
- เมื่อผู้เล่นจบการทดลอง เช่น หลังจากเล่นถึงด่านสุดท้ายของบทแรก ให้แสดง UI สำหรับการซื้อรุ่นเต็ม พร้อมปุ่มซื้อ:

- ปุ่มซื้อสามารถเรียกใช้ API
buyOutเพื่อเปิดหน้าต่างการชำระเงินของ Jogos ให้ผู้เล่นซื้อรุ่นเต็มได้ทันที - เมื่อผู้เล่นซื้อสำเร็จ แพลตฟอร์ม Jogos จะสลับเป็นรุ่นเต็มโดยอัตโนมัติ นักพัฒนาไม่ต้องดำเนินการเพิ่มเติม
- โปรดรักษาหมายเลขเวอร์ชันให้ตรงกันระหว่างรุ่นทดลองและรุ่นเต็ม เพื่อให้ Jogos โอนย้ายเซฟไฟล์ผู้เล่นโดยอัตโนมัติ
- เมื่อชำระเงินสำเร็จ ระบบจะส่งคืนหมายเลขคำสั่งซื้อ (orderNo) นักพัฒนาสามารถใช้หมายเลขนี้เพื่อตรวจสอบข้อมูลคำสั่งซื้อได้
::: tabs key:engine
== HTML5
// ส่งคืนหมายเลขคำสั่งซื้อสำเร็จ
let orderNo = await window.JOGOS_SDK.payment.buyOut();== Cocos
// ส่งคืนหมายเลขคำสั่งซื้อสำเร็จ
let orderNo = await JogosSDK.Game.buyOut();== Unity
// API ซื้อขาด - ต้อง initialize ฟีเจอร์การชำระเงินก่อน
JogosSDK.Goods.BuyOut((orderNo, goodsId)=>
{
// คอลแบ็กการสั่งซื้อสำเร็จ โปรดทราบว่านี่ยังไม่ใช่การชำระเงินเสร็จสิ้น
// การชำระเงินเสร็จสิ้นจะถูกแจ้งผ่าน SubscribeOrderPaid
// สามารถตรวจสอบสถานะคำสั่งซื้อได้ด้วย orderId
});:::
```