155 lines
4.8 KiB
PHP
155 lines
4.8 KiB
PHP
|
<?php
|
|||
|
// This example sets up an endpoint using the Slim framework.
|
|||
|
// Watch this video to get started: https://youtu.be/sGcNPFX1Ph4.
|
|||
|
|
|||
|
namespace app\home\controller;
|
|||
|
use think\facade\View;
|
|||
|
use think\facade\Lang;
|
|||
|
use think\facade\Db;
|
|||
|
|
|||
|
use Slim\Http\Request;
|
|||
|
use Slim\Http\Response;
|
|||
|
use Stripe\Stripe;
|
|||
|
|
|||
|
require_once root_path() . 'vendor/autoload.php';
|
|||
|
|
|||
|
class Ready extends BaseMall {
|
|||
|
|
|||
|
private static $key;
|
|||
|
|
|||
|
public function initialize() {
|
|||
|
parent::initialize(); // TODO: Change the autogenerated stub
|
|||
|
self::$key = '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';
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* Stripe支付
|
|||
|
* @access private
|
|||
|
* @author super
|
|||
|
* @date 2020-11-04
|
|||
|
* @param array $product 商品信息
|
|||
|
* @param int|float $amount 支付金额
|
|||
|
* @param array $pay_type 支付类型
|
|||
|
* @param string $currency 货币类型 小写
|
|||
|
* @return array
|
|||
|
*/
|
|||
|
private static function stripePay($product, $amount, $pay_type = ['card'], $currency = 'aud')
|
|||
|
{
|
|||
|
|
|||
|
require_once root_path() . 'vendor/autoload.php';
|
|||
|
require_once root_path() . 'vendor/stripe/stripe-php/init.php';
|
|||
|
|
|||
|
\Stripe\Stripe::setApiKey(self::$key);
|
|||
|
|
|||
|
header('Content-Type: application/json');
|
|||
|
|
|||
|
$YOUR_DOMAIN = 'https://lianke.keyutest.com/payment/';
|
|||
|
|
|||
|
$checkout_session = \Stripe\Checkout\Session::create([
|
|||
|
'payment_method_types' => $pay_type,
|
|||
|
'line_items' => [[
|
|||
|
'price_data' => [
|
|||
|
'currency' => $currency,
|
|||
|
'unit_amount' => $amount,
|
|||
|
'product_data' => $product
|
|||
|
],
|
|||
|
'quantity' => 1,
|
|||
|
]],
|
|||
|
'mode' => 'payment',
|
|||
|
'success_url' => $YOUR_DOMAIN . '/succ', // 支付成功后跳转url
|
|||
|
'cancel_url' => $YOUR_DOMAIN . '/cancel', // 支付失败后跳转url
|
|||
|
]);
|
|||
|
|
|||
|
var_dump($checkout_session);die;
|
|||
|
return ['id' => $checkout_session->id, 'payment_intent' => $checkout_session->payment_intent]; // payment_intent是识别支付与通知关系的唯一凭证
|
|||
|
}
|
|||
|
|
|||
|
public function pay()
|
|||
|
{
|
|||
|
|
|||
|
$product = [
|
|||
|
'name' => 'Order Number:' . '123123123' ,
|
|||
|
'images' => [
|
|||
|
'https://rongsp.com/Super/favicon.ico'
|
|||
|
]
|
|||
|
];
|
|||
|
$amount = 100;
|
|||
|
|
|||
|
$result = self::stripePay($product, $amount);
|
|||
|
if (!isset($result['id']) || !isset($result['payment_intent'])) {
|
|||
|
returnData(500, 'ERROR! BUSY NETWORK!');
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// 将凭证保存,便于在回调时查询订单
|
|||
|
// $update = Db::name('orders')->where('order_id', $order_info['order_id'])->update(['payment_intent' => $result['payment_intent']]);
|
|||
|
/* if (!$update) {
|
|||
|
returnData(500, 'ERROR! BUSY NETWORK!');
|
|||
|
}*/
|
|||
|
|
|||
|
// returnData(200, 'SUCCESS!', ['id' => $result['id']]);
|
|||
|
}
|
|||
|
|
|||
|
// 支付成功通知
|
|||
|
public function successNotify()
|
|||
|
{
|
|||
|
// Set your secret key. Remember to switch to your live secret key in production!
|
|||
|
// See your keys here: https://dashboard.stripe.com/account/apikeys
|
|||
|
\Stripe\Stripe::setApiKey(self::$key);
|
|||
|
|
|||
|
$payload = @file_get_contents('php://input');
|
|||
|
$event = null;
|
|||
|
|
|||
|
try {
|
|||
|
$event = \Stripe\Event::constructFrom(
|
|||
|
json_decode($payload, true)
|
|||
|
);
|
|||
|
} catch(\UnexpectedValueException $e) {
|
|||
|
// Invalid payload
|
|||
|
http_response_code(400);
|
|||
|
exit();
|
|||
|
}
|
|||
|
|
|||
|
// Handle the event
|
|||
|
switch ($event->type) {
|
|||
|
case 'charge.succeeded':
|
|||
|
|
|||
|
$succeeded = $event->data->object;
|
|||
|
|
|||
|
if ($succeeded->status == 'succeeded'){
|
|||
|
|
|||
|
$payment_intent = $succeeded->payment_intent;
|
|||
|
|
|||
|
// 查询订单详情
|
|||
|
$order_info = Db::name('orders')->where('payment_intent', $payment_intent)->find();
|
|||
|
if (!$order_info) {
|
|||
|
http_response_code(200);exit;
|
|||
|
}
|
|||
|
|
|||
|
if ($order_info['status'] != 0) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// 订单标记为处理中
|
|||
|
Db::name('orders')->where('order_id', $order_info['order_id'])->update(['pay_time' => time(), 'status' => 3]);
|
|||
|
|
|||
|
// 订单处理
|
|||
|
// ...
|
|||
|
|
|||
|
// 标记为处理完成
|
|||
|
Db::name('orders')->where('order_id', $order_info['order_id'])->update(['status' => 1]);
|
|||
|
}
|
|||
|
break;
|
|||
|
default:
|
|||
|
echo 'Received unknown event type ' . $event->type;
|
|||
|
}
|
|||
|
http_response_code(200);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|