返回
App Store支付验证接口更换,iOS开发者必看!
Android
2023-11-04 11:29:29
苹果支付验证接口更新:Go语言集成指南
背景
苹果公司最近宣布弃用旧的支付验证接口,取而代之的是一个新的接口。此变更旨在提高安全性并改善验证流程。
新接口的变化
- 请求方法从 POST 更改为 GET。
- 请求头需要包含 "Authorization" 字段,其值为 Bearer Token。
- 响应体格式从 JSON 更改为 XML。
如何在 Go 语言中使用新接口
要使用新接口进行支付验证,你需要执行以下步骤:
- 生成 JWT Token: 使用 "github.com/golang-jwt/jwt" 包生成 JWT Token,并用你的私钥对其进行签名。
- 构造 HTTP 请求: 构建一个 HTTP GET 请求,并将其发送到验证接口 "https://api.storekit.itunes.apple.com/inApps/v1/transactions"。
- 添加 JWT Token: 在请求头中添加 "Authorization" 字段,其值为 Bearer Token。
- 添加收据: 将要验证的收据添加到请求正文中。
- 发送请求: 使用 HTTP 客户端发送请求。
- 解析响应: 解析验证接口的 XML 响应,并将结果存储在
VerifyPaymentResponse
对象中。
注意事项
- 新接口仅支持验证 App Store 购买的商品。
- 请求必须使用 HTTP GET 方法。
- 请求头必须包含 "Authorization" 字段,其值为 Bearer Token。
- 响应体格式为 XML。
示例代码
import (
"bytes"
"encoding/xml"
"fmt"
"io/ioutil"
"net/http"
"time"
"github.com/golang-jwt/jwt"
)
func GenerateJWTToken() (string, error) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"iss": "YOUR_ISSUER_ID",
"iat": time.Now().Unix(),
"exp": time.Now().Add(time.Minute * 15).Unix(),
})
return token.SignedString([]byte("YOUR_PRIVATE_KEY"))
}
func VerifyPayment(receipt string, jwtToken string) (*http.Response, error) {
req, err := http.NewRequest("GET", "https://api.storekit.itunes.apple.com/inApps/v1/transactions", nil)
if err != nil {
return nil, err
}
req.Header.Add("Authorization", "Bearer "+jwtToken)
req.Body = ioutil.NopCloser(bytes.NewReader([]byte(receipt)))
return http.DefaultClient.Do(req)
}
func ParseVerifyPaymentResponse(resp *http.Response) (*VerifyPaymentResponse, error) {
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
var vpr VerifyPaymentResponse
if err := xml.Unmarshal(body, &vpr); err != nil {
return nil, err
}
return &vpr, nil
}
type VerifyPaymentResponse struct {
Status int `xml:"status"`
Environment string `xml:"environment"`
Receipt string `xml:"receipt"`
TransactionID string `xml:"transaction_id"`
ProductID string `xml:"product_id"`
Quantity int `xml:"quantity"`
UnitPrice string `xml:"unit_price"`
PurchaseDate string `xml:"purchase_date"`
ExpirationDate string `xml:"expiration_date"`
WebOrderLineItemID string `xml:"web_order_line_item_id"`
}
常见问题解答
1. 为什么需要使用新接口?
新接口更加安全,并提供更好的验证体验。
2. 如何获取私钥?
私钥可以在 App Store Connect 中找到。
3. 为什么我收到 401 未授权错误?
确保 JWT Token 有效,并且请求头中包含 "Authorization" 字段。
4. 如何处理验证失败?
根据验证失败的原因采取适当的措施。例如,如果收据无效,可以向用户提示错误消息。
5. 新接口是否与旧接口向后兼容?
否,新接口与旧接口不兼容。