【苹果支付二】apple pay苹果支付以及自动续订订阅开发
Song •
4071 次浏览 •
0个评论 •
2020年07月03日
一、APP端获取数据
1、订阅后APP端会获取到如下信息:
{
"payment": {
"productid": "1",
"quantity": "1"
},
"transactionDate": "2020-07-04 10:06:42",
"transactionIdentifier": "100000...",
"transactionReceipt": "ewoJInNpZ25hdHVyZSIgPSA...",
"transactionState": "1",
"errMsg": "requestPayment:ok"
}
2、沙盒续期时间是缩短了的,并且会在5次续订(一共6条收据)后自动取消
二、验证收据(调用apple server的接口)
1.普通购买收据验证
验收接口如下:
- 沙盒:
https://sandbox.itunes.apple.com/verifyReceipt
- 生产环境:
https://buy.itunes.apple.com/verifyReceipt
参数如下,transactionReceipt
为返回的凭证
:
{
"receipt-data" : transactionReceipt
}
注意:这里是POST
推送json
参数,以Laravel
使用guzzle 发送请求为例:
use GuzzleHttp\Client;
···
$client = new Client();
$transactionReceipt = "ewoJInNpZ25hd...";
$response = $client->request('POST', 'https://sandbox.itunes.apple.com/verifyReceipt', ['json' => ["receipt-data"=>$transactionReceipt]]);
$body = json_decode($response->getBody());
dd($body);
2、自动续费收据验证
自动订阅的收据验证接口和其他IAP
一样,只是需要加入password
参数:
{
"receipt-data": "(actual receipt bytes here)",
"password": "(shared secret bytes here)"
}
Laravel PHP
调用如需啊
$client = new Client();
$transactionReceipt = "ewoJInNpZ25hd...";
$response = $client->request('POST', 'https://sandbox.itunes.apple.com/verifyReceipt', ['json' => ["receipt-data"=>$transactionReceipt,,"password"=>"2d745..."]]);
$body = json_decode($response->getBody());
dd($body);
password
是在App Store connect
上创建的秘钥
三、返回数据说明
a、auto_renew_status: 订阅自动续订状态
- 1:-订阅将在当前订阅期结束时续订。
- 0:-客户已关闭其订阅的自动续订。
b、status: 状态码
一般票据会有3种情况:
- 0:刚付费,有效状态
- 21006:时间到了,没有续费
- 0:时间到了后,又续费了,返回的为0,即使是之前返回21006 的老凭据,只要续费后也返回0。
c、auto_renew_product_id: 在Apple App Store中标识产品的字符串。即产品ID
d、expires_date: 订阅的过期时间
e、original_transaction_id: 初次购买的交易标识。所有订阅的更新和恢复交易都共享这个标识。
f、original_purchase_date: 初次购买(订阅)的日期。
g、purchase_date: 交易的日期。对于更新订阅的交易来说,这个日期表示更新日期。如果从App Store解析的数据是最新的订阅收据,这个值表示最近更新订阅的日期。
h、latest_receipt:新的收据,即每次用户续订后返回新的latest_receipt凭证
,
注意:必须使用新的凭证才能查询新的续约信息,如果无新的续费信息则latest_receipt
值不会改变。可以对比latest_receipt
值判断是否有新的续费信息。
i、receipt、latest_expired_receipt_info、latest_receipt_info:返回数据,三个返回的数据类型是一样的、优先使用receipt
,使用老的收据返回latest_receipt_info
,使用新的收据
则返回latest_expired_receipt_info
。
各种状态操作流程参考【苹果支付一】应用内购买(IAP)各类型在服务端的验证规则
字段解释参考:Receipt Fields或者iOS内购 服务器文档 摘要
四、App Store状态回调
在APPStore
输入用于接收App Store
服务器通知的网址(URL)
配置此url
后,apple
会在以下状态时调用配置的接口。
- CANCEL:取消了订阅
- DID_CHANGE_RENEWAL_PREF:取消了订阅,在sandbox测试时,6次收据之后,就会变成这个状态
- DID_CHANGE_RENEWAL_STATUS:是各种状态改变下都会调用,比如说首次购买会收到两次回调,一个是INITIAL_BUY一个是DID_CHANGE_RENEWAL_STATUS
- DID_FAIL_TO_RENEW:由于结算问题,订阅无法续订
- DID_RECOVER:App Store通过计费重试恢复了已过期的订阅
- INITIAL_BUY:首次订阅成功
- INTERACTIVE_RENEWAL:恢复了订阅,在sandbox测试时,6次收据之后,重新订阅,就会是这个状态
- RENEWAL:恢复了订阅
- REFUND:AppleCare成功退还了有关消耗性,非消耗性或非续订订阅的交易
参考文档: notification_type
-
laravel中distinct()的使用方法与去重 2017-09-11
-
Laravel将view缓存为静态html,laravel页面静态缓存 2021-10-09
-
[ laravel爬虫实战--基础篇 ] guzzle描述与安装 2017-11-01
-
[ 配置教程 ] 在ubuntu16.04中部署LNMP环境(php7+maridb且开启maridb远程以及nginx多域名访问 )并配置laravel环境 2017-07-18
-
mysql如何给运营人员添加只有查询权限的账号 2024-12-02
热门文章
-
mysql如何给运营人员添加只有查询权限的账号 2024-12-02
-
Mac 安装mysql并且配置密码 2024-11-20
-
阿里云不同账号(跨账号)ECS服务器同地域如何实现免费内网互通? 2024-11-12
-
electron安装使用better-sqlite3并解决NODE_MODULE_VERSION xxx. This version of Node.js requires 2024-11-06
-
Zerotier+Moon+Nginx实现内网穿透搭建网站 2024-08-23
更多相关好文