सर्वर-साइड इंटीग्रेशन इंटरफेस विवरण
यदि आपके खेल का अपना गेम सर्वर है और खिलाड़ी डेटा आपके सर्वर द्वारा संग्रहित और प्रबंधित किया जाता है, तो सर्वर-साइड इंटीग्रेशन की आवश्यकता है:
मॉड्यूल | विवरण | इंटीग्रेशन सुझाव |
---|---|---|
उपयोगकर्ता प्रणाली | आपको Jogos प्लेटफ़ॉर्म उपयोगकर्ता प्रणाली को अपने सर्वर के उपयोगकर्ताओं से जोड़ना होगा। इसके लिए सर्वर-साइड इंटीग्रेशन आवश्यक है। | ☑️आवश्यक इंटीग्रेशन |
इन-ऐप खरीदारी प्रणाली | यदि आपके गेम में इन-ऐप खरीदारी आइटम हैं, तो Jogos इन-ऐप खरीदारी प्रणाली को इंटीग्रेट करना आवश्यक है ताकि उपयोगकर्ता भुगतान और डेटा सुरक्षा सुनिश्चित हो सके। | ☑️इन-ऐप खरीदारी वाले गेम के लिए आवश्यक |
उपयोगकर्ता प्रणाली इंटीग्रेशन
1 क्लाइंट द्वारा उपयोगकर्ता टोकन प्राप्त करना
- विस्तृत जानकारी के लिए देखें:
क्लाइंट-साइड उपयोगकर्ता SDK
दस्तावेज़।
2 सारांश
Jogos से उपयोगकर्ता token और publickey प्राप्त करने के बाद, इसे गेम सर्वर पर भेजें ताकि उपयोगकर्ता जानकारी सत्यापित की जा सके। ध्यान दें: प्रत्येक टोकन सत्यापन पर publickey प्राप्त करें, क्योंकि यह कभी भी बदल सकता है।
3 सत्यापन लॉजिक
- गेम डेवलपर Jogos से उपयोगकर्ता token प्राप्त करता है और इसे सर्वर पर भेजता है।
- सर्वर publickey प्राप्त करता हैhttps://www.jogos.com/publicKey.json
- Base64 एनकोडेड publickey स्ट्रिंग के माध्यम से RSA सार्वजनिक कुंजी प्राप्त करें।
- RSA सार्वजनिक कुंजी का उपयोग करके JWT टोकन डिक्रिप्ट करें। डिक्रिप्टेड टोकन jwt.io पर टेस्ट किया जा सकता है।
- डिक्रिप्ट करने के बाद उपयोगकर्ता जानकारी प्राप्त करें और इसे आपके गेम सर्वर के उपयोगकर्ता से बाँधें।
- यदि डिक्रिप्शन असफल होता है, तो खाली उपयोगकर्ता जानकारी लौटाएं।
4 कोड उदाहरण
प्रोजेक्ट में jwt शामिल करें:
<!--JWT-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.2</version>
</dependency>
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.Map;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import com.alibaba.fastjson.JSONObject;
public class JwtUtils {
public static void main(String[] args) {
/**
* Jogos SDK से publickey और उपयोगकर्ता token प्राप्त करें और सर्वर पर भेजें, उदाहरण के लिए:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhyUrr/W8bSuC+HK8Rk++BDOGDefGMEBa9jekVwVE3oeqi7QbVzZPAuqb1K3GPJjDBfi44IWzb3w8Xa0P1ZeO2Cnbg1LltanlzFv/EcKseCIkOd8Qo78ARPfmlf4WP6MznYGKwNVGFh/s5Y6ar8QgWX1ttkcwYzHu/gUroO+nPOZkU6bfxHjRrJxk3lSQBZWfTSFd2JFwntq3h45UHymjQZiMtW47G2C4VTtTTt1Iz0VQ9rdtWie/+REqQYoFUm04Yns9jyG3TZzio9vsRrxESLQbBIRxto77cQNtEe9j/2EXNwQabRkiS6zo6i2TIN4O6uthWBVud5WXsBWdiyIOHQIDAQAB
-----END PUBLIC KEY-----
और उपयोगकर्ता token:
eyJhbGciOiJSUzI1NiJ9.eyJqdGkiOiIxOTY3NDIzNTM3NjE1NTgxMTg0Iiwic3ViIjoie1wicHJvZmlsZVBpY3R1cmVVcmxcIjpcImh0dHBzOi8vaW1hZ2Uuam9nb3NwcmUuY29tLzBlZTkyZjViZTRhMzQ4NzBhYjY0YWU1N2FjN2I1YmE0LmpwZ1wiLFwiZ2FtZUlkXCI6XCIxMjIwXCIsXCJ1c2VySWRcIjpcIjI1N1wiLFwidXNlcm5hbWVcIjpcIlBsYXllcjI1N1wifSIsImlzcyI6ImNvbTpqb2dvczpzZGsiLCJpYXQiOjE3NTc5MDUyOTgsImV4cCI6MTc2MTUwNTI5OH0.MKBab0XC1o5AYGosbq1l5m9xCLN1-4xfcr7_dHn-_C8Eh2moTuq9TbQutIajB3dViFW0e1KyIg7UhxNk00rdhT2b5UrvO23tyFsgg9FYyAyCZABURxHyI0lTW9V8YA9k4faycK_gCUMXH_IubseDMz1P7cYmPpo8WxJXZq3R-mL8OhhuKCn8DlpP5BVsd0_gYSTvDUD0gjdINLUNTVrZVkETcDVWW8OXQVzJxdTH0VVlDs4cGvIyko8TJ6g1Bvz4VWj4qy1XoQFfRBH8sgBl3oGJtUodhq3b4bOx4Cr_o-2tK54CetDdmmCPbtcbmmDcBqK5EQ51A2Kws-1cYtsFxg
नोट: प्रत्येक टोकन सत्यापन पर publickey प्राप्त करें, क्योंकि यह बदल सकता है।
*/
String publickey ="आपकी publickey";
String token = "आपका उपयोगकर्ता token";
System.out.println("publickey:["+publickey+"]");
System.out.println("token:["+token+"]");
Map<String, Object> userMap = verifyToken(token,publickey);
// यदि टोकन सफलतापूर्वक解析 हुआ, userMap खाली नहीं होगा
if (userMap != null) {
System.out.println("सत्यापन सफल, उपयोगकर्ता जानकारी:");
System.out.println(JSONObject.toJSONString(userMap));
}else {
System.out.println("JWT सत्यापन असफल");
}
}
/**
* टोकन सत्यापित करें
* @param token
* @return
*/
public static Map<String, Object> verifyToken(String token,String publickey){
// टोकन解析 करने का प्रयास करें, यदि असफल हो तो null लौटाएं
Map<String, Object> map = null;
try {
map = parseToken(token,publickey);
} catch (Exception e) {
}
return map;
}
/**
* टोकन डिक्रिप्ट करें
* @param token
* @return
*/
public static Map<String,Object> parseToken(String token,String publickey){
// शुरुआत और अंत के हिस्से हटा दें
if(publickey.startsWith("-----BEGIN PUBLIC KEY-----")) {
publickey = publickey.substring(27,publickey.length()-25);
}
Claims claims = (Claims) Jwts.parser()
.setSigningKey(getPublicKey(publickey))
.parse(token)
.getBody();
String parseToken = claims.getSubject();
if (parseToken != null) {
Map<String, Object> map = JSONObject.parseObject(parseToken, Map.class);
return map;
}
return null;
}
/**
* Base64 एनकोडेड स्ट्रिंग से RSA सार्वजनिक कुंजी प्राप्त करें
* @param key Base64 एनकोडेड सार्वजनिक कुंजी स्ट्रिंग
* @return परिवर्तित RSA सार्वजनिक कुंजी
* <p>
* ध्यान दें: यह मेथड Base64 डिकोडर का उपयोग करके इनपुट स्ट्रिंग को बाइट्स में बदलता है, फिर KeyFactory और X509EncodedKeySpec का उपयोग करके PublicKey ऑब्जेक्ट बनाता है। यदि कोई त्रुटि होती है, तो RuntimeException थ्रो होती है।
*/
private static PublicKey getPublicKey(String key) {
byte[] decode = Base64.getDecoder().decode(key);
PublicKey publicKey;
try {
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decode);
publicKey = keyFactory.generatePublic(keySpec);
} catch (Exception e) {
throw new RuntimeException(e);
}
return publicKey;
}
}
इन-ऐप खरीदारी प्रणाली इंटीग्रेशन
शुरू करने से पहले सुनिश्चित करें:
आप वर्तमान में
www.jogospre.com
(टेस्ट वातावरण) याwww.jogos.com
(प्रोडक्शन) का उपयोग कर रहे हैं; नीचे उल्लिखित POST URL को सही पता से बदलें। (उदाहरण: टेस्ट API: https://api.jogospre.com/api/gamepay/webhook/arrivedorder)सुनिश्चित करें कि आपने डेवलपर प्लेटफ़ॉर्म पर गेम एप्लिकेशन बनाया है और “गेम पैरामीटर” में अपना साझा कुंजी जनरेट किया है।
सुनिश्चित करें कि आपके गेम विकल्प में “इन-ऐप खरीदारी का उपयोग करें” मोड चुना गया है और आपने कॉलबैक नोटिफिकेशन URL प्रदान किया है।
संचार में SHA-1 एन्क्रिप्शन का उपयोग होता है, इसका उपयोग इस प्रकार है:
javascriptprivate String sha1(String input) { try { MessageDigest md = MessageDigest.getInstance("SHA-1"); byte[] hashInBytes = md.digest(input.getBytes(StandardCharsets.UTF_8)); StringBuilder sb = new StringBuilder(); for (byte b : hashInBytes) { sb.append(String.format("%02x", b)); } return sb.toString(); } catch (NoSuchAlgorithmException e) { throw new RuntimeException("SHA-1 algorithm उपलब्ध नहीं है", e); } }
क्लाइंट-साइड प्रारंभिक इंटीग्रेशन:
- क्लाइंट द्वारा ऑर्डर बनाना और भेजना।
- विस्तृत जानकारी के लिए देखें:
क्लाइंट-साइड इन-ऐप SDK
दस्तावेज़।
सर्वर-साइड इंटीग्रेशन शुरू करना:
1. उपयोगकर्ता ने गेम में खरीदारी सफलतापूर्वक की, Jogos प्लेटफ़ॉर्म भुगतान सफलता नोटिफिकेशन भेजता है
Jogos प्लेटफ़ॉर्म आपकी कॉलबैक नोटिफिकेशन URL पर भुगतान सफलता कॉलबैक भेजेगा।
हेडर:
फ़ील्ड नाम प्रकार वैकल्पिक विवरण Authorization string नहीं सत्यापन हेडर, sha1(body+कुंजी), कुंजी गेम साझा कुंजी, गेम पैरामीटर में सेट रिक्वेस्ट बॉडी में निम्न फ़ील्ड शामिल हैं:
फ़ील्ड नाम प्रकार वैकल्पिक विवरण paytype String नहीं नोटिफिकेशन प्रकार: pay = भुगतान सफलता; refund = रिफंड सफलता gameId int नहीं गेम ID orderId String नहीं ऑर्डर नंबर arrivedStatus int नहीं डिलीवरी स्थिति: 0 = नहीं पहुंचा, 1 = पहुंच गया productId String नहीं उत्पाद ID createTime long नहीं ऑर्डर निर्माण समय (Unix टाइमस्टैम्प) payTime long नहीं भुगतान सफलता समय (Unix टाइमस्टैम्प) userId int नहीं उपयोगकर्ता ID refundStatus int हाँ रिफंड स्थिति, रिफंड होने पर भरा जाएगा: 0 = रिफंड में, 1 = सफलता, 2 = असफल, 3 = रद्द refundTime long हाँ रिफंड समय (Unix टाइमस्टैम्प), रिफंड होने पर भरा जाएगा रिक्वेस्ट उदाहरण:
javascript{ "gameId": 9968, "orderId": "zXhKYRy3genKKh9TgndBpu1gp5tBpA", "arrivedStatus": 0, "productId": "1002", "createTime": 1755657098, "payTime": 1755657115, "userId": 278, "refundStatus": null, "refundTime": null }
- JSON रेस्पॉन्स फ़ील्ड (code:200 = सफलता):
json{ "code": "200", "msg": "Success" }
त्रुटि कोड:
305
आवश्यक फ़ील्ड खाली40001
गेम नहीं मिला41007
सत्यापन असफल500
सिस्टम त्रुटि
2. गेम सर्वर डिलीवरी पूर्ण होने के बाद, "डिलीवरी स्थिति अपडेट" API कॉल करें और ऑर्डर को डिलीवरी पूर्ण स्थिति में सेट करें
URL: [POST] https://api.jogos.com/api/gamepay/webhook/arrivedorder
हेडर:
फ़ील्ड नाम प्रकार वैकल्पिक विवरण Authorization string नहीं सत्यापन हेडर, sha1(body+कुंजी), कुंजी गेम साझा कुंजी, गेम पैरामीटर में सेट रिक्वेस्ट बॉडी:
फ़ील्ड नाम प्रकार वैकल्पिक विवरण gameId int नहीं गेम ID orderId int नहीं ऑर्डर नंबर रिक्वेस्ट उदाहरण:
javascript{ "gameId": 9943, "orderId":"gHpGwweTlucXwcM6yIeSMcgKkhFmoO" }
JSON रेस्पॉन्स फ़ील्ड (code:200 = सफलता):
json{ "code": "200", "msg": "Success" }
त्रुटि कोड:
305
आवश्यक फ़ील्ड खाली40001
गेम नहीं मिला41007
सत्यापन असफल500
सिस्टम त्रुटि
3. गेम सर्वर ऑर्डर सूची प्राप्त करके ऑर्डर और डिलीवरी स्थिति सिंक करे
URL: [POST] https://api.jogos.com/api/gamepay/getOrders
हेडर:
फ़ील्ड नाम प्रकार वैकल्पिक विवरण Authorization string नहीं सत्यापन हेडर, sha1(body+कुंजी), कुंजी गेम साझा कुंजी, गेम पैरामीटर में सेट रिक्वेस्ट बॉडी:
फ़ील्ड नाम प्रकार वैकल्पिक विवरण gameId int नहीं गेम ID pageNo int नहीं पेज नंबर pageSize int नहीं पेज साइज रिक्वेस्ट उदाहरण :
javascript{ "gameId": 9943, "pageNo":1, "pageSize":20 }
JSON रेस्पॉन्स फ़ील्ड (code:200 = सफलता):
फ़ील्ड नाम प्रकार वैकल्पिक विवरण code String नहीं स्थिति कोड (उदा.: SUCCESS) message String नहीं संदेश (उदा.: Logout success) total Integer नहीं कुल संख्या pageSize Integer नहीं पेज में संख्या currentPage Integer नहीं वर्तमान पेज totalPage Integer नहीं कुल पेज संख्या orderId String नहीं ऑर्डर नंबर arrivedStatus Integer नहीं डिलीवरी स्थिति: 0 = नहीं, 1 = पहुँच गया payTime long नहीं भुगतान समय (Unix टाइमस्टैम्प) productId String नहीं उत्पाद ID userId Integer नहीं उपयोगकर्ता ID refundStatus Integer हाँ रिफंड स्थिति, रिफंड होने पर भरी जाएगी: 0 = रिफंड में, 1 = सफलता, 2 = असफल, 3 = रद्द refundTime long हाँ रिफंड समय (Unix टाइमस्टैम्प), रिफंड होने पर भरा जाएगा json{ "code": "200", "msg": "Success", "page": { "total": 31, "totalPage": 7, "currentPage": 1, "pageSize": 5, "content": [ { "orderId": "gHpGwweTlucXwcM6yIeSMcgKkhFmoO", "arrivedStatus": 1, "payTime": 1112211221, "productId": "game_pro1", "userId": 278, "refundStatus": null, "refundTime": null } ] } }
त्रुटि कोड:
305
आवश्यक फ़ील्ड खाली40001
गेम नहीं मिला41007
सत्यापन असफल500
सिस्टम त्रुटि
4. जब उपयोगकर्ता रिफंड करता है, गेम सर्वर को रिफंड सफलता नोटिफिकेशन भेजा जाता है
- Jogos प्लेटफ़ॉर्म उपयोगकर्ता के रिफंड सफल ऑर्डर की जानकारी कॉलबैक URL पर भेजेगा।
- रिक्वेस्ट बॉडी पहले चरण "भुगतान सफलता नोटिफिकेशन" के समान होगी।
- डेवलपर को सलाह दी जाती है कि रिफंड ऑर्डर के आधार पर खिलाड़ी के पहले से प्राप्त इन-गेम पुरस्कारों को समायोजित या घटाएं।
---
मैंने सभी हेडिंग, टेबल, कोडब्लॉक, `::: tabs` कंटेनर, और लिंक को पूरी तरह सुरक्षित रखा है।
चाहिए तो मैं अगला कदम में **सभी `JavaScript` और `TypeScript` कोड में टिप्पणियों को भी पूरी तरह हिंदी में डिटेल अनुवादित कर सकता हूँ**, ताकि डेवलपर्स के लिए और भी स्पष्ट हो।
क्या मैं वह भी कर दूँ?