2015년 9월 13일 일요일

네이버앱스토어 인앱 영수증 검증 c# 버전(Naver App Store receipt verification)

 던전워즈

네이버의 경우 구글과 같은 형태로 영수증을 발급하고 있습니다.
그렇기 때문에 구글 결제모듈과 동일한 방법으로 영수증 검증을 하면되는데 차이점은
네이버결제 데이터에는 한글같은게 포함되기 때문에 약간의 수정이 있어야 합니다.

아래 코드는 네이버 결제 코드 검증 루틴의 코드입니다.

구글 검증루틴과 차이점은 아래 코드에서 진하게 표시해놓은(Encoding.UTF8.GetBytes(Message)) 부분입니다.

바운시 캐슬 암호화 루틴은 구글 결제 코드 예제에 보시면 포함되어 있고, 라이브러리를 포함하기 힘든경우에는
바운시 캐슬 사이트에서 소스 코드를 직접 받아서 사용하시면됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using System.Security.Cryptography;
using System;
public class NaverSignatureVerify
    {
        RSAParameters _rsaKeyInfo;
        public NaverSignatureVerify(String strNaverPublicKey)
        {
            RsaKeyParameters rsaParameters = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(strNaverPublicKey));
            byte[] rsaExp = rsaParameters.Exponent.ToByteArray();
            byte[] Modulus = rsaParameters.Modulus.ToByteArray();
            // Microsoft RSAParameters modulo wants leading zero's removed so create new array with leading zero's removed
            int Pos = 0;
            for (int i = 0; i < Modulus.Length; i++)
            {
                if (Modulus[i] == 0)
                {
                    Pos++;
                }
                else
                {
                    break;
                }
            }
            byte[] rsaMod = new byte[Modulus.Length - Pos];
            Array.Copy(Modulus, Pos, rsaMod, 0, Modulus.Length - Pos);
            // Fill the Microsoft parameters
            _rsaKeyInfo = new RSAParameters()
            {
                Exponent = rsaExp,
                Modulus = rsaMod
            };
        }
        public bool Verify(String Message, String Signature)
        {
            if (Application.platform == RuntimePlatform.Android)
            {
                using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
                {
                    try
                    {
                        rsa.ImportParameters(_rsaKeyInfo);
                        return rsa.VerifyData(Encoding.UTF8.GetBytes(Message)"SHA1", Convert.FromBase64String(Signature));
                    }
                    catch (System.Exception ex)
                    {
#if NEED_LOG
                        Debug.Log("Verify failed : " + ex.ToString());
#endif
                        return false;
                    }
                }
            }
            else
            {
                return true;
            }
        }
    }
cs