返回

App Store支付验证接口更换,iOS开发者必看!

Android

苹果支付验证接口更新:Go语言集成指南

背景

苹果公司最近宣布弃用旧的支付验证接口,取而代之的是一个新的接口。此变更旨在提高安全性并改善验证流程。

新接口的变化

  • 请求方法从 POST 更改为 GET。
  • 请求头需要包含 "Authorization" 字段,其值为 Bearer Token。
  • 响应体格式从 JSON 更改为 XML。

如何在 Go 语言中使用新接口

要使用新接口进行支付验证,你需要执行以下步骤:

  1. 生成 JWT Token: 使用 "github.com/golang-jwt/jwt" 包生成 JWT Token,并用你的私钥对其进行签名。
  2. 构造 HTTP 请求: 构建一个 HTTP GET 请求,并将其发送到验证接口 "https://api.storekit.itunes.apple.com/inApps/v1/transactions"。
  3. 添加 JWT Token: 在请求头中添加 "Authorization" 字段,其值为 Bearer Token。
  4. 添加收据: 将要验证的收据添加到请求正文中。
  5. 发送请求: 使用 HTTP 客户端发送请求。
  6. 解析响应: 解析验证接口的 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. 新接口是否与旧接口向后兼容?

否,新接口与旧接口不兼容。