Skip to content

Instantly share code, notes, and snippets.

@jmcguirk
Last active August 29, 2015 14:15
Show Gist options
  • Save jmcguirk/2943144c3785428b7e61 to your computer and use it in GitHub Desktop.
Save jmcguirk/2943144c3785428b7e61 to your computer and use it in GitHub Desktop.
Golang Gplay IAB Receipt Verify
package main
import (
"crypto"
"crypto/rsa"
"crypto/sha1"
"crypto/x509"
"encoding/base64"
"fmt"
)
const GOOGLE_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs0sb13qWwvaP7QkG1SurfIuktGjwVt4UAIn8/jsdTMSAu1I8In18ACLWvc6h7smTSq3IA4ZOBjfm7V+cfpj2RS7koipEHgkoeIHLC/ptqXnLbOHM2neDPbcWYCJxoI3l610mE15moRHFg0CnrmaB/jEeLvVbHJi9ZAVUFTIDVvyhFfnZJRLV8lhxIDrCK9YMDbnHnTAcB2z4oBUcrKyTs+p8k7yomL0WfDsARVGWimey2hEnqAiw+420muZgdkjBqCwNvfcfIUXqKwK/tXOxO3fdn8aAXFgBkklQXPzn1xNWWYLdlbCCtliE3VDeZ3Y9r2Xx9WNeP4iyjOIsPx1L2QIDAQAB"
func verifyAndroidReceipt(receipt string, signatureFromClient string) bool{
key, _ := base64.StdEncoding.DecodeString(GOOGLE_PUBLIC_KEY)
re, err := x509.ParsePKIXPublicKey(key)
pub := re.(*rsa.PublicKey)
if err != nil {
fmt.Println(err)
return false
}
text := []byte(receipt)
h := sha1.New()
h.Write(text)
digest := h.Sum(nil)
ds, _ := base64.StdEncoding.DecodeString(signatureFromClient)
err = rsa.VerifyPKCS1v15(pub, crypto.SHA1, digest, ds)
return err == nil
}
func main() {
receipt2 := "{\"orderId\":\"12999763169054705758.1342362929927805\",\"packageName\":\"com.dickbuttgames.fakegame\",\"productId\":\"android_sku_1\",\"purchaseTime\":1423845098885,\"purchaseState\":0,\"purchaseToken\":\"cfifdgbhkaoalbdfepplibnf.AO-J1OzWJivIlKbjF5eQbwK7-w4y5ICnnnW85a7vfNVORzwzh-xJn1_aVKWhsifbBvPiz6sUlxkJMSyiJvzsmlD20B\"}";
signatureFromClient2 := "e8gj4Yu8KS/Yl3y2xDbzcEn47yrflnTPSJ7rv3eMxw4/cp0Q8pphRM/eiym+3RtG4BoCxhgad7DStX7QPPkT0kiziGENIFl0vqnKzQ5AqisoMmziwr7hBDkNO9DxDVqtNEAlmFgaX233QPwNquS3jLl2D/NmLFe5qzo5sLg6DvACLJHIvs0+KzCw0HLMSP7T7F50GRBrfmKsXb+GZlpdxODuNHwAeMIJTVVUYd/lX/cYxx8vHy/Pj5+Bq0Lf2hCj+z8awJm9WecLp96bnK26UHAfKf6+FLLMCgS0zJXih6PSEWh7f0FMxxZ1BoQ5/ko058skLgLBp4jbsemvyw=="
if verifyAndroidReceipt(receipt2,signatureFromClient2){
fmt.Println("Receipt 2 Was Valid!")
} else{
fmt.Println("Receipt 2 Was NOT Valid")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment