GooglePayment.php
5.24 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
<?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 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()
{
// load our config.json that contains our credentials for accessing google's api as a json string
$configJson = public_path().'/client_secret_724392566830-jv6gqcb7vv8q9vavihhu5siccdit35op.apps.googleusercontent.com.json';
// define an application name
$applicationName = 'Parlando一言临境';
// create the client
$client = new \Google_Client();
$client->setApplicationName($applicationName);
$client->setAuthConfig($configJson);
$client->setAccessType('offline'); // necessary for getting the refresh token
$client->setApprovalPrompt ('force'); // necessary for getting the refresh token
// scopes determine what google endpoints we can access. keep it simple for now.
$client->setScopes(
[
\Google\Service\Oauth2::USERINFO_PROFILE,
\Google\Service\Oauth2::USERINFO_EMAIL,
\Google\Service\Oauth2::OPENID,
\Google_Service_AndroidPublisher::ANDROIDPUBLISHER,
\Google\Service\Drive::DRIVE_METADATA_READONLY // allows reading of google drive metadata
]
);
$client->setIncludeGrantedScopes(true);
// google 服务端默认获得受权
$client->useApplicationDefaultCredentials();
// 设置 google client_email
$client->setSubject("client_email");
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;
}
}