GooglePayment.php
10.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
<?php
/**
* Created by PhpStorm.
* User: lishuai
* Date: 2022/2/15
* Time: 4:23 PM
*/
namespace App\Payment;
use App\Models\MembershipGood;
use App\Models\Order;
use App\Models\User;
use App\Models\UserProfile;
use Carbon\Carbon;
use Google\Service\AndroidPublisher\SubscriptionPurchasesAcknowledgeRequest;
use GuzzleHttp\Client;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
class GooglePayment implements PaymentInterface
{
const IS_SANDBOX = true;
public $client;
public function __construct()
{
$this->client = $this->getGoogleClient();
}
public function prepare(Order $order)
{
// 查询订单对应的产品id
}
private function getGoogleClient()
{
$credentials_file = public_path().'/pc-api-7482901338487549764-603-566eccf76b91.json';
$client = new \Google_Client();
try{
$client->setAuthConfig($credentials_file);
}catch (\Google\Exception $exception){
Log::debug('用户授权出错了'.$exception->getMessage());
}
$applicationName = 'Parlando一言临境';
$client->setApplicationName($applicationName);
$client->setScopes(
[
\Google_Service_AndroidPublisher::ANDROIDPUBLISHER,
]
);
return $client;
}
// public function notify($order_sn, $token)
// {
// $order = Order::query()->where('order_sn', $order_sn)->first();
//
// if ($order->status != Order::UNPAID) return false;
//
// $validator =new \Google_Service_AndroidPublisher($this->client);
//
// $packageName = 'pub.yiyan.parlando.Parlando';
// $productId = 'test.yiyan.vip.1.month';
//// $token = '客户端传过来的 支付凭证';
// $optps = array();
// /**
// * 成功会返回
// * 返回字段解释 https://developers.google.com/android-publisher/api-ref/purchases/products
// *
// * 返回字段解释 中文翻译
// * consumptionState int 消费类产品的消费状态 0有待消费1已消耗
// * developerPayload string onyx系统生成的唯一ID
// * kind sgring 购买的对象
// * orderId sgring 客户支付订单ID(google play 订单ID)
// * purchaseState int 订单的采购状态 0购买1取消
// * purchaseTimeMillis int 时间戳
// * purchaseType int 扩展字段 0 测试 1促销
// * Array(
// * [consumptionState] => 1
// * [developerPayload] => 你的订单号
// * [kind] => androidpublisher#productPurchase
// * [orderId] => google play 订单号
// * [purchaseState] => 0
// * [purchaseTimeMillis] => 1542187625018
// * [purchaseType] =>
// * )
// */
// try {
// $resp = $validator->purchases_products->get($packageName, $productId, $token, $optps);
// // 对象转数组
// $resp = get_object_vars($resp);
// } catch (\Exception $e) {
// Log::debug('got error = ' . $e->getMessage() . PHP_EOL);
// throw new \Exception('got error = ' . $e->getMessage() . PHP_EOL);
// }
//
// if ($resp['consumptionState'] != 1) return false;
//
// /** 修改订单状态*/
// $order->pay_time = Carbon::now();
// $order->status = Order::PAID;
// $order->save();
//
// /** 给用户加会员*/
// $goods = MembershipGood::query()->find($order->order_goods->goods_id);
// if ($goods->limit_unit == '月') {
// $days = intval($goods->limit_days) * 30;// 计算天数
// } elseif ($goods->limit_unit == '年') {
// $days = intval($goods->limit_days) * 365;// 计算天数
// } else {
// $days = intval($goods->limit_days) * 1;// 计算天数
// }
// $user = UserProfile::query()->find($order->user_id);
// if ($user->is_vip == 0){
// $user->is_vip = 1;
// $user->create_vip_time = Carbon::now();
// $user->expire_vip_time = Carbon::now()->addDays($days);
// }else{
// if (Carbon::now()->gte($user->expire_vip_time)){ // 已经过期了
// $user->expire_vip_time = Carbon::now()->addDays($days);
// }else{
// $user->expire_vip_time = Carbon::parse($user->expire_vip_time)->addDays($days);
// }
// }
//
// $user->buy_number += 1;
// $user->buy_amount += $order->pay_amount;
// $user->last_buy_time = Carbon::now();
// $user->save();
//
// /** 修改订单状态*/
// $order->status = Order::DONE;
// $order->save();
//
// return true;
// }
public function notify($string)
{
//subscriptionNotification(订阅相关)、oneTimeProductNotification(一次性购买相关)testNotification(测试发布相关) 三个不会同时存在任意2个
//subscriptionNotification说明
//参数名 说明
//version 此通知的版本。最初,此值为“1.0”。此版本与其他版本字段不同。
//notificationType int 订阅的 notificationType 可以参考下面的表
//purchaseToken 购买订阅时向用户设备提供的令牌
//subscriptionId 所购买订阅的 ID(例如“monthly001”)
//SUBSCRIPTION_RECOVERED - 从帐号保留状态恢复了订阅。
//SUBSCRIPTION_RENEWED - 续订了处于活动状态的订阅。
//SUBSCRIPTION_CANCELED - 自愿或非自愿地取消了订阅。如果是自愿取消,在用户取消时发送。
//SUBSCRIPTION_PURCHASED - 购买了新的订阅。
//SUBSCRIPTION_ON_HOLD - 订阅已进入帐号保留状态(如果已启用)。
//SUBSCRIPTION_IN_GRACE_PERIOD - 订阅已进入宽限期(如果已启用)。
//SUBSCRIPTION_RESTARTED - 用户已通过 Play > 帐号 > 订阅重新激活其订阅(需要选择使用订阅恢复功能)。
//SUBSCRIPTION_PRICE_CHANGE_CONFIRMED - 用户已成功确认订阅价格变动。
//SUBSCRIPTION_DEFERRED - 订阅的续订时间点已延期。
//SUBSCRIPTION_PAUSED - 订阅已暂停。
//SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED - 订阅暂停计划已更改。
//SUBSCRIPTION_REVOKED - 用户在到期时间之前已撤消订阅。
//SUBSCRIPTION_EXPIRED - 订阅已到期。
// 'acknowledgementState' => 1,
// 'autoRenewing' => false, // 设置是否在订阅到期时自动续订。
// 'autoResumeTimeMillis' => NULL,
// 'cancelReason' => 1, //订阅被取消或未自动续订的原因。可能的值包括:0.用户取消了订阅 1.由于结算问题 2.系统取消了订阅 2. 订阅被新的订阅取代了。3.开发者已取消订阅
// 'cancelSurveyResultType' => 'Google\\Service\\AndroidPublisher\\SubscriptionCancelSurveyResult',
// 'cancelSurveyResultDataType' => '',
// 'countryCode' => 'CA',
// 'developerPayload' => '',
// 'emailAddress' => NULL,
// 'expiryTimeMillis' => '1668023054641', // 订阅的到期时间
// 'externalAccountId' => NULL,
// 'familyName' => NULL,
// 'givenName' => NULL,
// 'introductoryPriceInfoType' => 'Google\\Service\\AndroidPublisher\\IntroductoryPriceInfo',
// 'introductoryPriceInfoDataType' => '',
// 'kind' => 'androidpublisher#subscriptionPurchase',
// 'linkedPurchaseToken' => NULL,
// 'obfuscatedExternalAccountId' => 'osnB10209503106007', //我们系统的订单号
// 'obfuscatedExternalProfileId' => NULL,
// 'orderId' => 'GPA.3390-9999-6519-16223..5',
// 'paymentState' => NULL, //订阅的付款状态。可能的值包括:0=待处理付款,1=付款已收讫,2=免费试用,3=延迟升级/降级.已取消、已过期的订阅不会显示。
// 'priceAmountMicros' => '5490000', // 订阅价格。例如,如果订阅价格为 1.99 欧元,priceAmountMicros 为 1990000。
// 'priceChangeType' => 'Google\\Service\\AndroidPublisher\\SubscriptionPriceChange',
// 'priceChangeDataType' => '',
// 'priceCurrencyCode' => 'CAD',
// 'profileId' => NULL,
// 'profileName' => NULL,
// 'promotionCode' => NULL,
// 'promotionType' => NULL,
// 'purchaseType' => 0, // 订阅的购买类型 0=测试,1=促销,当购买交易不是使用标准的应用内购买结算流程时,系统才会设置此字段。
// 'startTimeMillis' => '1668020958362',
// 'userCancellationTimeMillis' => NULL,
// 'internal_gapi_mappings' =>
$data = json_decode(base64_decode($string),true);
Log::debug('返回的数据:====================');
Log::debug(print_r($data,true));
$packageName = $data['packageName'];
if (isset($data['subscriptionNotification'])) {
$subscriptionId = $data['subscriptionNotification']['subscriptionId'];
$purchaseToken = $data['subscriptionNotification']['purchaseToken'];
//1.3. 根据解密后的内容去google接口做查询校验并发货(关键参数expiryTimeMillis)
//根据解密后的内容去google接口做校验
//Google文档地址
//请求域名(Get/form):
//https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}
$validator =new \Google_Service_AndroidPublisher($this->client);
$resp = $validator->purchases_subscriptions->get($packageName, $subscriptionId, $purchaseToken);
Log::debug('新订阅人员:====================');
Log::debug(var_export($resp,true));
Log::debug("购买状态" . $resp->getAcknowledgementState()); //0。待确认 1. 已确认
//1.4. 消耗该笔订单
//Google文档地址
//请求域名(Post/form)
//https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:acknowledge
// $acknowledge = new SubscriptionPurchasesAcknowledgeRequest();
// $acknowledge->developerPayload = ''; // todo 可以将我们系统的订单号、用户支付金额等存入谷歌订单里
// $resp = $validator->purchases_subscriptions->acknowledge($packageName, $subscriptionId, $purchaseToken,$acknowledge);
//
// Log::debug('消耗结果:====================');
// Log::debug(var_export($resp,true));
// todo 发货
}
}
}