首页 > 解决方案 > 接收消费请求通知并发送消费信息

问题描述

如果用户开始退款,苹果将向商家服务器发送 Consumption_Request 通知。当我尝试处理消费请求通知并调用发送消费信息接口将用户消费信息发送到苹果服务器时,我得到了两种形式的响应。

情况1 :

当我的参数错误时,响应如下:在此处输入图像描述

案例2:

当我的参数正确时,响应代码为 401,如下所示:在此处输入图像描述

我发现 401 的意思是 Unauthorized 。所以也许我的 JWT 检查失败了。

所以我的问题是你如何生成你的 JWT 令牌?有演示吗?以及如何获取您的密钥文件(.p8 文件。我怀疑我得到了错误的文件)?

标签: jwtapple-push-notifications

解决方案


你如何生成你的 JWT 令牌?

这是 golang 的一个示例

func readPrivateKeyFromFile(keyFile string) (*ecdsa.PrivateKey, error) {
    bytes, err := ioutil.ReadFile(keyFile)
    if err != nil {
        return nil, err
    }

    block, _ := pem.Decode(bytes)
    if block == nil {
        return nil, errors.New("appstore private key must be a valid .p8 PEM file")
    }

    key, err := x509.ParsePKCS8PrivateKey(block.Bytes)
    if err != nil {
        return nil, err
    }

    switch pk := key.(type) {
    case *ecdsa.PrivateKey:
        return pk, nil
    default:
        return nil, errors.New("appstore private key must be of type ecdsa.PrivateKey")
    }

}

func generateToken(privateKey *ecdsa.PrivateKey) (string, error) {
    token := jwt.NewWithClaims(jwt.SigningMethodES256, jwt.MapClaims{
        "iss":   "issuerId,
        "isa":   time.Now().Unix(),
        "exp":   expireTIme,
        "aud":   "appstoreconnect-v1",
        "nonce": "uuid",
        "bid":   "bid",
    })

    token.Header["kid"] = "keyId"
    token.Header["alg"] = "ES256"
    token.Header["typ"] = "JWT"

    return token.SignedString(privateKey)
}

你如何得到你的密钥文件(.p8 文件。我怀疑我得到了一个错误的文件)?

请参考文档https://developer.apple.com/documentation/appstoreserverapi/creating_api_keys_to_use_with_the_app_store_server_api?changes=latest_major


推荐阅读