83 lines
1.8 KiB
Go
83 lines
1.8 KiB
Go
package appChargeUtil
|
||
|
||
import (
|
||
"errors"
|
||
"fmt"
|
||
|
||
"goutil/webUtil"
|
||
)
|
||
|
||
const (
|
||
con_SandBoxUrl = "https://sandbox.itunes.apple.com/verifyReceipt"
|
||
con_ProductionUrl = "https://buy.itunes.apple.com/verifyReceipt"
|
||
)
|
||
|
||
var (
|
||
NetworkError = errors.New("NetWorkError")
|
||
)
|
||
|
||
// 验证充值是否有效
|
||
// bundleIdentifierList:配置的BundleIdentifier列表
|
||
// productId:输入的ProductId
|
||
// receiptData:订单数据
|
||
// isSandBox:是否为沙盒模式
|
||
// 返回值:
|
||
// 充值收据对象
|
||
// 是否有效
|
||
// 错误对象(如果err==NetWorkError,则表明为网络错误)
|
||
func ValidateCharge(bundleIdentifierList []string, productId, receiptData string, isSandBox bool) (receiptObj *Receipt, isValid bool, err error) {
|
||
// 判断参数是否为空
|
||
if len(bundleIdentifierList) == 0 || productId == "" || receiptData == "" {
|
||
return
|
||
}
|
||
|
||
// 获取Receipt对象
|
||
receiptObj, err = getReceipt(receiptData, isSandBox)
|
||
if err != nil {
|
||
return
|
||
}
|
||
|
||
if receiptObj.IsBundleIdentifierValid(bundleIdentifierList) == false {
|
||
return
|
||
}
|
||
|
||
if receiptObj.IsProductIdValid(productId) == false {
|
||
return
|
||
}
|
||
|
||
isValid = true
|
||
|
||
return
|
||
}
|
||
|
||
func getReceipt(receiptData string, isSandBox bool) (receiptObj *Receipt, err error) {
|
||
weburl := con_ProductionUrl
|
||
if isSandBox {
|
||
weburl = con_SandBoxUrl
|
||
}
|
||
|
||
data := []byte(convertReceiptToPost(receiptData))
|
||
statusCode, returnBytes, err := webUtil.PostByteData2(weburl, data, webUtil.GetFormHeader(), nil)
|
||
if err != nil {
|
||
err = NetworkError
|
||
return
|
||
}
|
||
if statusCode != 200 {
|
||
err = fmt.Errorf("StatusCode is wrong:%d", statusCode)
|
||
return
|
||
}
|
||
|
||
if len(returnBytes) == 0 {
|
||
err = fmt.Errorf("返回的数据为空")
|
||
return
|
||
}
|
||
|
||
receiptObj, err = newReceipt(string(returnBytes))
|
||
|
||
return
|
||
}
|
||
|
||
func convertReceiptToPost(receiptData string) string {
|
||
return fmt.Sprintf("{\"receipt-data\":\"%s\"}", receiptData)
|
||
}
|