php 实现stripe支付流程

news2024/11/28 18:59:58

1.申请账号获取密钥key

2.申请创建商品,创建价格,创建支付,

//创建商品
public function create_product(){  
    $_key = self::STRIPE_KEY;
    $stripe = new \Stripe\StripeClient($_key);
    $arr =  $stripe->products->create([
        'name' => $goods_name,
    ]);
    //  print_r($arr->id);die;
    $this->create_price($arr->id,$order_id,$is_source);
}
//创建价格
public function create_price($product_id,$order_id,$is_source){
    //获取订单对应的商品价格
    $goods_price = \db('order')->where('id',$order_id)->value('pay_money');
  
    $_key = self::STRIPE_KEY;
    $stripe = new \Stripe\StripeClient($_key);
    $price_arr = $stripe->prices->create([
       'unit_amount' => $goods_price*100,
        //'unit_amount' => 1*100,
        'currency' => 'usd',
        'tax_behavior' => 'exclusive',
        //'recurring' => ['interval' => 'day'],
        'product' => $product_id,
    ]);
    //print_r($price_arr->id);die;
    $this->actionStripe($price_arr->id,$order_id,$is_source);
}
/**
 * 创建stripe支付
 */
public function actionStripe($price_id,$order_id,$is_source)
{
    $_key = self::STRIPE_KEY;

    $domain = $this->request->domain();

    //如果是AI订阅和AI作品打样的话
     if ($is_source == 8 || $is_source == 9){
         $cancel_url = 'https://ai.jewelryhunt.net/index/aimobile/mobile_list';
         $success_url = 'https://ai.jewelryhunt.net/index/aimobile/order';
     }else{
         $cancel_url = $domain.'/index/user/orders';
         $success_url = $domain . '/index/stripepay/success_info';
     }
    // stripe 生成订单

    \Stripe\Stripe::setApiKey($_key);
    $checkout_session = \Stripe\Checkout\Session::create([
        'line_items' => [[
            'price' => $price_id, // 产品id
            'quantity' => 1,
        ]],
        'mode' => 'payment',
        'success_url' => $success_url,
        'cancel_url' => $cancel_url,
        'automatic_tax' => [
            'enabled' => true,
        ],
        'metadata' => [
            'order_id' => $order_id,
        ],
    ]);
    header("HTTP/1.1 303 See Other");
    header("Location: " . $checkout_session->url);

}

4.配置回调事件

5.

/**
 * stripe支付回调
 */
public function actionNotify()
{
    \think\Log::record('支付进来了', 'info');
    $_key = self::STRIPE_KEY;
    \Stripe\Stripe::setApiKey($_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
    \think\Log::record('event12333333' . var_export($event->type, true), 'info');
    switch ($event->type) {
        case 'checkout.session.completed':
            $succeeded = $event->data->object;
            $content = "=========".date('Y-m-d H:i:s',time())."==========\r\n";
            $content .= json_encode($succeeded);
            \think\Log::record('content=======' . var_export($content, true), 'info');
            $token = input('token', '');

            if ($succeeded->status == 'complete') {
                $order_id = $succeeded->metadata->order_id;
                $pay_type = input('pay_type', 1);
      
            }
            break;
        case 'checkout.session.async_payment_failed':
            \think\Log::record('pay is failed', 'info');
            break;
        default:
            echo 'Received unknown event type ' . $event->type;
            break;
    }
    \think\Log::record('done', 'info');
    return true;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1008362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Arcgis多值提取至点所有波段数值一样

Arcgis多值提取至点所有波段数值一样 问题描述 进行多值提取多波段后的结果,所有波段数值都是一样的。 原因 操作流程问题,输入栅格只选择了一个栅格文件 解决方案 实际上,每个波段都会对应一个栅格文件,要把这些添加进去 这…

【网络编程】深入理解TCP协议二(连接管理机制、WAIT_TIME、滑动窗口、流量控制、拥塞控制)

TCP协议 1.连接管理机制2.再谈WAIT_TIME状态2.1理解WAIT_TIME状态2.2解决TIME_WAIT状态引起的bind失败的方法2.3监听套接字listen第二个参数介绍 3.滑动窗口3.1介绍3.2丢包情况分析 4.流量控制5.拥塞控制5.1介绍5.2慢启动 1.连接管理机制 正常情况下,TCP需要经过三…

淘宝/天猫获取商品销量详情 API 返回值说明

item_get_sales-获取商品销量详情 API测试工具 taobao.item_get_sales 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_…

SEO优化排名的技巧与注意点(百度SEO排名的五大注意点)

关键词排名是指在搜索引擎中,用户搜索相关关键词时,网站出现的顺序。SEO优化是提高网站排名的一种方法。优化关键词排名的目的是提高网站流量和知名度。但是要注意遵循百度SEO排名的规则。 下面介绍一下百度SEO排名的五大注意点和优化关键词的六种方式。…

Arcgis提取每个像元的多波段反射率值

Arcgis提取每个像元的多波段反射率值 数据预处理 数据预处理阶段需要对遥感图像进行编辑传感器参数、辐射定标、大气校正、正射校正,具体流程见该文章 裁剪研究区 对于ENVI处理得到的tiff影像,虽然是经过裁剪了,但是还存在黑色的背景值&a…

JDK、eclipse软件的安装

一、打开JDK安装包 二、复制路径 三、点击我的电脑,找到环境变量 四、新建环境 变量名:JAVA_HOME 变量值就是刚刚复制的路径 五、在path中建立新变量 双击path 打印以下文字 最后一直双击确定,安装环境完成。 六、双击eclipse 选择好安装…

Sentinel控制台配置 持久化到nacos

sentinel控制台,使用方便,功能强大。使用官方的jar包,配置不会持久化,sentinel重启后会导致,之前的规则全部丢失,下面一起改造源码实现规则数据的持久化 sentinel源码地址 (github访问太慢&am…

React TypeScript 定义组件的各种方式

目录 举例说明1. 使用 class 定义2. 使用函数定义2.1 使用普通函数2.2 使用函数组件 举例说明 比如我们要定义一个计数器 Counter,它包含一个 label 和一个 button,计数器的初始值由外部传入,点击 button 计数加 1: 这虽然是个简单组件&…

第25章_瑞萨MCU零基础入门系列教程之看门狗定时器-WDT

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…

iOS17正式版9月18日正式发布!怎么更新即将发布的iOS17正式版?

苹果在今天举办的“好奇心上头”发布会结束后,推送了iOS 17和iPadOS 17发布候选版本(Release Candidate Version),同时宣布将于9月18日面向iPhone和iPad 用户,推送iOS17/iPadOS 17正式版更新。苹果表示iOS 17的设计理念…

C# Onnx Yolov8 Detect 物体检测

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System…

自动化办公更简单了:新版python-office,有哪些更新?

#职场经验谈# 大家好,这里是程序员晚枫,小破站/小红薯都叫这个名。 去年4月开源了一个Python自动化办公项目:python-office,GitHub和Gitee都能看到。1行代码实现复杂的自动化办公任务,帮助不懂代码的小白,…

处理SQLSyntaxErrorException异常:数据库表 ‘books‘ 不存在;

目录 背景介绍 我的问题中的解决方法 通用方法 背景介绍 今天遇见了这个问题,解决后发出来分享一下 Java应用程序中的SQLSyntaxErrorException:表 bookmanagement.books 不存在问题解决 解决MySQL错误:无法找到表 bookmanagement.books…

Java native 关键字

如你在看 JDK 的源代码的时候,大概率会看到很多方法使用了 native 关键字。 下面是 String 对象 JDK 中的源代码,就带有了一个 native 关键字。 native 是干什么用的 简单来说就是 Java 的 native 方法的实现不是用 Java 实现的,可能在其他…

2023最新AI创作商用ChatGPT源码分享+支持AI绘画

一、SparkAI智能创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文…

OPENCV--实现meanshift图像分割

Meanshift原理 效果图 API # -*- coding:utf-8 -*- """ 作者:794919561 日期:2023/9/13 """ import cv2 import numpy as npimg = cv2.imread("F:\\learnOpenCV\\openCVLearning\\pictures\\Lena.jpg

计算机视觉的应用14-目标检测经典算法之YOLOv1-YOLOv5的模型架构与改进过程详解,便于记忆

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用14-目标检测经典算法之YOLOv1-YOLOv5的模型架构与改进过程详解,便于记忆。YOLO(You Only Look Once)是一种目标检测深度学习模型。想象一下,传统的目…

做机器视觉工程师,其实挺没意思的

3.康耐视VisionPro高级脚本系列教程-3.脚本编辑错误和运行错误调试方法,break和Contitinuee的差别_哔哩哔哩_bilibili 其实人生就是“有时有意思,有时没意思”。 心里有太多的不甘心,太多的苦水,是没法再吃学习的苦&#xff0c…

Linux系统编程多线程(C++)

目录 【1】引入如何看待地址空间和列表 【2】什么是线程 【3】线程的优点 【4】线程的缺点 【5】线程异常 【6】线程用途 【7】线程VS进程 【8】Linux线程控制 【8.1】查看轻量级线程指令 【8.2】线程创建 【8.2.1】POSIX线程库 【8.2.2】创建线程 【8.2.3】一次性…

1054. 距离相等的条形码;823. 带因子的二叉树;1878. 矩阵中最大的三个菱形和

1054. 距离相等的条形码 核心思想:隔一个数填一个,优先填写出现次数多的数。注意点就是条形码的长度为奇数和偶数,但是我们遵循先优先填偶数就不会出错即可。 823. 带因子的二叉树 核心思想:递归。定义dfs(val)表示以值val作为根…