php 对接Pangle海外广告平台收益接口Reporting API

今天对接的是Pangle广告reporting api接口,拉取广告收益回来自己做统计。记录分享给大家
首先是文档地址,进入到Pangle后台就能看到文档地址以及参数:
文档地址:https://www.pangleglobal.com/zh/integration/reporting-api-v2
在这里插入图片描述

在这里插入图片描述

接入这些第三方广告平台,流程基本上一样,拿好参数之后可以直接开始对接了,我直接贴代码出来:

$params = array(
            "currency" => "usd",
            "date" => $date,
            "time_zone" => 0,
            "timestamp" => time()
        );
        $url = pangle::get_media_rt_income_url('MD5', $params);
        $client = new Client();
        $response = $client->request('GET', $url);
        $result = json_decode($response->getBody()->getContents(), true);
        ......下面是自己的逻辑代码

params 组装好参数,一个就是收益的计量单位,我们使用的是美元,还有就是时区

<?php

namespace App\Services\ThirdApi\lib;

final class pangle
{

    private static $user_id = 2222;                # Replace with your user_id
    private static $role_id = 11111;               # Replace with your role_id
    private static $secure_key = "-11111;    # Replace with your Secutiry Key
    private static $version = "2.0";
    const PANGLE_HOST = "https://open-api.pangleglobal.com";
    const KEY_SIGN_TYPE = "sign_type";
    const KEY_SIGN = "sign";
    const KEY_ROLE_ID = "role_id";
    const KEY_USER_ID = "user_id";
    const KEY_VERSION = "version";

    // Supported sign method
    private static $sign_array = array(
        'MD5' => 'sign_md5',
    );

    // md5 sign method
    private static function sign_md5($str, $key)
    {

        $sign_str = $str . $key;
        $sign = md5($sign_str);
        #printf("md5 [sign string without key:%s] => [%s]", $sign_str,$sign);
        return $sign;
    }

    // Examine sign method
    private static function valid_sign_method($method)
    {

        if (empty(self::$sign_array[$method])) {
            printf("unexpected sign method %s", $method);
            return false;
        }
        return true;
    }

    // Sign the string
    private static function sign($method, $str, $key)
    {
        if (!self::valid_sign_method($method)) {
            return false;
        }

        return call_user_func(array('self', self::$sign_array[$method]), $str, $key);
    }

    // Sign the array
    private static function make_sign($method, $arr_input, $sign_key)
    {
        // Config array to be signed
        $sign_str = '';
        foreach ($arr_input as $key => $val) {
            $sign_str .= '&' . strval($key) . '=' . strval($val);
        }
        $sign_str = substr($sign_str, 1);

        // Sign
        $ret = self::sign($method, $sign_str, $sign_key);
        return $ret;
    }

    // Create signed query string
    private static function make_signed_querystring($method, $arr_input, $key, $key_sign = self::KEY_SIGN, $key_sign_method = self::KEY_SIGN_TYPE)
    {
        // Sign
        $sign = self::make_signed_array_utf8($method, $arr_input, $key, $key_sign, $key_sign_method);
        if (!$sign) {
            return false;
        }

        // Create querystring
        $query_string = http_build_query($arr_input);

        return sprintf("%s&%s=%s", $query_string, $key_sign, $sign);
    }

    /**
     * to retuen data in json,convert the sign result  into utf-8
     * @param sign_method, array to sign, secure_key, array key of sign and sign_method
     * @return result of sign when success while false if not.
     */
    private static function make_signed_array_utf8($method, &$arr_input, $key, $key_sign = self::KEY_SIGN, $key_sign_method = self::KEY_SIGN_TYPE)
    {
        // add the sign method into the array to be signed
        $arr_input[$key_sign_method] = $method;
        $arr_input[self::KEY_VERSION] = self::$version;
        if (self::$role_id != "") {
            $arr_input[self::KEY_ROLE_ID] = self::$role_id;
        }

        if (self::$user_id != "") {
            $arr_input[self::KEY_USER_ID] = self::$user_id;
        }

        // Sort Array
        if (!ksort($arr_input)) {
            printf("make_signed_array_utf8::sort arr_input failed, arr: %s", printf($arr_input, true));
            return false;
        }

        // create string to be signed
        $signStr = '';
        foreach ($arr_input as $inputKey => $inputVal) {
            $signStr .= '&' . $inputKey . '=' . $inputVal;
        }
        $signStr = substr($signStr, 1);

        // convert the string to utf-8
        $signStr = mb_convert_encoding($signStr, 'UTF-8', 'GBK');

        // Sign
        $ret = self::sign($method, $signStr, $key);
        if (!$ret) {
            printf("make sign_utf8 failed, method:%s, str:%s", $method, print_r($arr_input, true));
            return false;
        }
        return $ret;
    }

    static function get_media_rt_income_url($method, $arr_input, $key_sign = self::KEY_SIGN, $key_sign_method = self::KEY_SIGN_TYPE)
    {
        try {
            $needDelArr = array();
            foreach ($arr_input as $key => $value) {
                if ($value === "") {
                    array_push($needDelArr, $key);
                }
            }
            foreach ($needDelArr as $key => $value) {
                unset($arr_input[$value]);
            }

            return self::PANGLE_HOST . "/union_pangle/open/api/rt/income?" . self::make_signed_querystring($method, $arr_input, self::$secure_key, $key_sign, $key_sign_method);
        } catch (Exception $e) {
            printf($e->getMessage());
            return "";
        }
    }

    static function set_secure_key($secure_key)
    {
        self::$secure_key = $secure_key;
    }

    static function set_user_id($user_id)
    {
        self::$user_id = $user_id;
    }

    static function set_role_id($role_id)
    {
        self::$role_id = $role_id;
    }

}

这个是Pangle封装的类,我们直接使用即可
Pangle基本上参数组装之后,再用它的方法生成一个请求地址,然后GET请求就能拿到相应的数据,
请求参数有这些,大家根据自己的需求添加

下面是请求参数,有些是必选的,有些是过滤指标,相关参数,大家根据自己需要选择
支持的参数有下面这些

在这里插入图片描述

$model_type = [
            'android' => 1,
            'ios' => 2,
        ];

然后就是返回设备类型,安卓返回的是android,苹果返回的是ios,大家根据自己的需要存储
以上是我对接Pangle广告收益接口代码,欢迎大家交流学习,希望能对你有帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[SWPU2019]Web4

[SWPU2019]Web4 PDO注入&#xff08;堆叠注入&#xff09; 首先发现一个登录框&#xff0c;但是不能注册进行抓包&#xff0c;发现json数据格式&#xff0c;猜测可能是sql注入或者xxe漏洞 输入 ’ 报错&#xff0c;但是输入"或者‘ “ 不报错->猜测为堆叠注入[[mysql…

6.shell中的计算

目录 概述实践shell结果 结束 概述 shell中计算 实践 shell #!/bin/bash # 计算 expr、let 都只能用于整形计算a3 bexpr $a 3 echo "b$b" cexpr $b / 3 echo "c$c"# let 命令 表达式 let "a10" echo "a10$a" let "a/10&quo…

拓展商城系统的未来:微服务维度的创新之路

随着电子商务的快速发展&#xff0c;传统的单体式商城系统在应对日益复杂的业务需求和用户体验方面逐渐显露出局限性。而基于微服务架构的商城系统&#xff0c;通过多维度的拆分和组合&#xff0c;正在为商城行业带来全新的创新和发展机遇。本文将深入探讨微服务维度下的商城系…

查找众数及中位数 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 众数是指一组数据中出现次数量多的那个数&#xff0c;众数可以是多个。 中位数只是指把一组数据从小到大排列&#xff0c;最中间的那个数&#xff0c;如果这组数…

罗德与施瓦茨 FSU8频谱分析仪

181/2461/8938产品概述&#xff1a; Rohde & Schwarz FSU8是一款高性能频谱分析仪&#xff0c;在相位噪声、动态范围和测量精度方面具有出色的性能&#xff0c;可应对航空航天和国防领域的任何射频分析挑战&#xff0c;也可用于高达8 GHz的一般微波应用。 为了处理产品开…

端口如何映射到外网?

在现代信息化社会中&#xff0c;远程访问已经成为人们工作和生活中不可或缺的一部分。复杂的网络环境和网络限制可能会给远程连接带来不便。在这种情况下&#xff0c;端口映射到外网的技术应运而生。本文将介绍端口映射到外网的概念、应用场景以及一种优秀的解决方案——【天联…

五、C#归并排序算法

简介 归并排序是一种常见的排序算法&#xff0c;它采用分治法的思想&#xff0c;在排序过程中不断将待排序序列分割成更小的子序列&#xff0c;直到每个子序列中只剩下一个元素&#xff0c;然后将这些子序列两两合并排序&#xff0c;最终得到一个有序的序列。 归并排序实现原…

vue+elementui中table实现单选行功能

el-table插件可以选择行&#xff0c;但是只能多选&#xff0c;而项目中有单选的需求。 效果如下图所示&#xff0c;点击行或者点击复选框都可以选中行&#xff08;高亮&#xff0c;复选框选中&#xff09;&#xff0c;并且每次只选中当前行&#xff0c;之前选中的行清空。点击标…

Spring-Mybatis字段映射

MybatisComfig.xml文件设置 <settings><setting name"mapUnderscoreToCamelCase" value"true"/> </settings> 完成全局配置将数据库下划线映射为驼峰式命名

螺栓的规格型号及表示方法——SunTorque智能扭矩系统

螺栓作为一种重要的紧固件&#xff0c;广泛应用于各种机械、设备和建筑结构中。了解和掌握螺栓的规格型号及表示方法对于正确选择和使用螺栓具有重要意义。本文SunTorque智能扭矩系统将详细介绍螺栓的规格型号及表示方法&#xff0c;帮助读者更好地理解和应用相关知识。 螺栓是…

两个免费的wordpress主模板

wordpress免费网站主题 蓝色高端大气上档次的wordpress免费网站主题&#xff0c;首页大图wordpress模板。 https://www.wpniu.com/themes/31.html WP免费模板 用粉色高端大气上档次的WP免费模板&#xff0c;建个网站也不错的。 https://www.wpniu.com/themes/16.html

海外版大宗商品现货交易系统开发/现货新篇

全球视野&#xff0c;现货新篇——揭秘海外版大宗商品现货交易系统的创新之旅 在全球化的大潮中&#xff0c;大宗商品现货交易早已成为各国经济发展的重要支柱。随着技术的日新月异&#xff0c;传统的交易方式已难以满足市场的多元化需求。而在这个背景下&#xff0c;我们隆重…

稀碎从零算法笔记Day22-LeetCode:

题型&#xff1a;链表 链接&#xff1a;2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;Leet 题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 …

如何在Linux系统中确定CPU架构

在Linux环境中&#xff0c;了解系统所采用的CPU架构对于安装兼容软件、配置系统性能优化等方面至关重要。本文将介绍三种简单有效的方法来查询Linux系统的CPU架构。 方法1&#xff1a;使用lscpu命令 运行如下命令&#xff0c;可以快速获取CPU架构信息&#xff1a; lscpu | g…

Python内置对象

Python是一种强大的、动态类型的高级编程语言&#xff0c;其内置对象是构成程序的基础元素。Python的内置对象包括数字、字符串、列表、元组、字典、集合、布尔值和None等&#xff0c;每种对象都有特定的类型和用途。 01 什么是内置对象 这些对象是编程语言的基础构建块&…

Linux环境变量【终】

&#x1f30e;环境变量 文章目录&#xff1a; 环境变量 环境变量的组织方式 创建自己的环境变量       main函数参数       C语言提供的变量与接口 环境变量与本地变量 了解本地变量       取消本地变量和环境变量 环境变量的出处 总结 前言&#xff1a; 上…

Css提高——Css3盒子模型border-box

1、盒子模型的种类与区别 CSS3 中可以通过 box-sizing 来指定盒模型&#xff0c;有2个值&#xff1a;即可指定为 content-box、border-box&#xff0c;这样我们 计算盒子大小的方式就发生了改变。 CSS3 盒子模型 可以分成两种情况&#xff1a; 1. box-sizing: content-box 盒…

【机器学习智能硬件开发全解】(九)—— 政安晨:通过ARM-Linux掌握基本技能【C语言程序的预处理过程】

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 机器学习智能硬件开发全解 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; C语言程序的预处理过程是在编译阶段之前进行的&#x…

UE5中各类型的英文名称缩写(直接用于文件前缀)

真正开发项目时用到的素材文件是相当巨量的&#xff0c;在资产中查找时由于不区分文件夹&#xff0c;因此查找是比较头疼的&#xff0c;所以很多同类型的文件名命名时要加入缩写。 本文提供初学者内容包中的缩写&#xff0c;并会在此后陆续加入自定义的缩写&#xff08;本部分…

css实现的3D立体视觉效果鸡蛋动画特效

这是一个基于纯css实现的3D立体视觉效果鸡蛋动画特效&#xff0c;喜欢的朋友可以拿来使用演示动态效果 css实现的3D立体视觉效果鸡蛋动画特效