Skip to content

सर्वर-साइड इंटीग्रेशन इंटरफेस विवरण

यदि आपके खेल का अपना गेम सर्वर है और खिलाड़ी डेटा आपके सर्वर द्वारा संग्रहित और प्रबंधित किया जाता है, तो सर्वर-साइड इंटीग्रेशन की आवश्यकता है:

मॉड्यूलविवरणइंटीग्रेशन सुझाव
उपयोगकर्ता प्रणालीआपको Jogos प्लेटफ़ॉर्म उपयोगकर्ता प्रणाली को अपने सर्वर के उपयोगकर्ताओं से जोड़ना होगा। इसके लिए सर्वर-साइड इंटीग्रेशन आवश्यक है।☑️आवश्यक इंटीग्रेशन
इन-ऐप खरीदारी प्रणालीयदि आपके गेम में इन-ऐप खरीदारी आइटम हैं, तो Jogos इन-ऐप खरीदारी प्रणाली को इंटीग्रेट करना आवश्यक है ताकि उपयोगकर्ता भुगतान और डेटा सुरक्षा सुनिश्चित हो सके।☑️इन-ऐप खरीदारी वाले गेम के लिए आवश्यक

उपयोगकर्ता प्रणाली इंटीग्रेशन

1 क्लाइंट द्वारा उपयोगकर्ता टोकन प्राप्त करना

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>
java
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 एन्क्रिप्शन का उपयोग होता है, इसका उपयोग इस प्रकार है:

    javascript
    private 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);
        }
    }

क्लाइंट-साइड प्रारंभिक इंटीग्रेशन:

सर्वर-साइड इंटीग्रेशन शुरू करना:

1. उपयोगकर्ता ने गेम में खरीदारी सफलतापूर्वक की, Jogos प्लेटफ़ॉर्म भुगतान सफलता नोटिफिकेशन भेजता है

  • Jogos प्लेटफ़ॉर्म आपकी कॉलबैक नोटिफिकेशन URL पर भुगतान सफलता कॉलबैक भेजेगा।

  • हेडर:

    फ़ील्ड नामप्रकारवैकल्पिकविवरण
    Authorizationstringनहींसत्यापन हेडर, sha1(body+कुंजी), कुंजी गेम साझा कुंजी, गेम पैरामीटर में सेट
  • रिक्वेस्ट बॉडी में निम्न फ़ील्ड शामिल हैं:

    फ़ील्ड नामप्रकारवैकल्पिकविवरण
    paytypeStringनहींनोटिफिकेशन प्रकार: pay = भुगतान सफलता; refund = रिफंड सफलता
    gameIdintनहींगेम ID
    orderIdStringनहींऑर्डर नंबर
    arrivedStatusintनहींडिलीवरी स्थिति: 0 = नहीं पहुंचा, 1 = पहुंच गया
    productIdStringनहींउत्पाद ID
    createTimelongनहींऑर्डर निर्माण समय (Unix टाइमस्टैम्प)
    payTimelongनहींभुगतान सफलता समय (Unix टाइमस्टैम्प)
    userIdintनहींउपयोगकर्ता ID
    refundStatusintहाँरिफंड स्थिति, रिफंड होने पर भरा जाएगा: 0 = रिफंड में, 1 = सफलता, 2 = असफल, 3 = रद्द
    refundTimelongहाँरिफंड समय (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 सिस्टम त्रुटि
    *सामान्य चेतावनी*
    • यदि गेम सर्वर 200 नहीं लौटाता, तो भुगतान सेवा 3 घंटे बाद कई बार पुनः प्रयास करेगी, अधिकतम 5 बार।
    • जब भुगतान सर्वर नोटिफिकेशन प्राप्त हो, तो फ़ील्ड सत्यापित करें:
    javascript
    public boolean verifySignature(String body, String authorizationHeader) throws Exception
    {
        if (authorizationHeader == null || !authorizationHeader.startsWith("Signature "))
        {
            throw new Exception("\"Authorization\" हेडर Jogos webhook में नहीं मिला या अमान्य है।");
        }
    
        String clientSignature = authorizationHeader.substring(10); // "Signature " को छोड़ें
        String serverSignature = sha1(body + your_key); // your_key = गेम साझा कुंजी
    
        return clientSignature.equals(serverSignature);
    }

2. गेम सर्वर डिलीवरी पूर्ण होने के बाद, "डिलीवरी स्थिति अपडेट" API कॉल करें और ऑर्डर को डिलीवरी पूर्ण स्थिति में सेट करें

  • URL: [POST] https://api.jogos.com/api/gamepay/webhook/arrivedorder

  • हेडर:

    फ़ील्ड नामप्रकारवैकल्पिकविवरण
    Authorizationstringनहींसत्यापन हेडर, sha1(body+कुंजी), कुंजी गेम साझा कुंजी, गेम पैरामीटर में सेट
  • रिक्वेस्ट बॉडी:

    फ़ील्ड नामप्रकारवैकल्पिकविवरण
    gameIdintनहींगेम ID
    orderIdintनहींऑर्डर नंबर

    रिक्वेस्ट उदाहरण:

    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

  • हेडर:

    फ़ील्ड नामप्रकारवैकल्पिकविवरण
    Authorizationstringनहींसत्यापन हेडर, sha1(body+कुंजी), कुंजी गेम साझा कुंजी, गेम पैरामीटर में सेट
  • रिक्वेस्ट बॉडी:

    फ़ील्ड नामप्रकारवैकल्पिकविवरण
    gameIdintनहींगेम ID
    pageNointनहींपेज नंबर
    pageSizeintनहींपेज साइज

    रिक्वेस्ट उदाहरण :

    javascript
    {
        "gameId"9943,
        "pageNo":1,
        "pageSize":20
    }
  • JSON रेस्पॉन्स फ़ील्ड (code:200 = सफलता):

    फ़ील्ड नामप्रकारवैकल्पिकविवरण
    codeStringनहींस्थिति कोड (उदा.: SUCCESS)
    messageStringनहींसंदेश (उदा.: Logout success)
    totalIntegerनहींकुल संख्या
    pageSizeIntegerनहींपेज में संख्या
    currentPageIntegerनहींवर्तमान पेज
    totalPageIntegerनहींकुल पेज संख्या
    orderIdStringनहींऑर्डर नंबर
    arrivedStatusIntegerनहींडिलीवरी स्थिति: 0 = नहीं, 1 = पहुँच गया
    payTimelongनहींभुगतान समय (Unix टाइमस्टैम्प)
    productIdStringनहींउत्पाद ID
    userIdIntegerनहींउपयोगकर्ता ID
    refundStatusIntegerहाँरिफंड स्थिति, रिफंड होने पर भरी जाएगी: 0 = रिफंड में, 1 = सफलता, 2 = असफल, 3 = रद्द
    refundTimelongहाँरिफंड समय (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` कोड में टिप्पणियों को भी पूरी तरह हिंदी में डिटेल अनुवादित कर सकता हूँ**, ताकि डेवलपर्स के लिए और भी स्पष्ट हो।  

क्या मैं वह भी कर दूँ?