tp5整合ping++支付

   Ping++是一个聚合支付平台,集成了微信支付、支付宝、银联支付、百度钱包、QQ钱包等多种主流支付方式。接入Ping++的好处是只用管理一套支付的代码,降低了程序猿的开发量。

    Ping++支付api传送门: https://www.pingxx.com/api  

    Ping++ SDK下载传送门:https://www.pingxx.com/docs/downloads  

  针对已遇到过的支付场景,我封装了一套Ping++的php代码:
<?php
//文件名 pingxx_my_model.php
include_once(__DIR__.'/pingpp-php-master/init.php'); //引入官方PHP SDK
 
define('APP_ID', "");   //配置应用id
define('APP_KEY', "");  //配置应用秘钥
 
class Pingxx_my_model
{
    private $channel_supported = array(  //支持的支付渠道
        'alipay', 'wx', 'alipay_wap', 'alipay_pc_direct'
    );
 
 
    //创建charge对象
    public function create_charge($channel, $amount, $order_no, $extra=array(), $description='', $subject ='', $body=''){
        /*----检查参数格式----*/
        if (!in_array($channel, $this->channel_supported)){
            return array(
                'code' => 0,
                'data' => array(
                    'error_message' => 'channel "'.$channel.'" has not been supported yet'
                )
            );
        }
        if ( $amount<=0 ){
            return array(
                'code' => 0,
                'data' => array(
                    'error_message' => 'amount format invalid'
                )
            );
        }
        if (!preg_match('/^[0-9a-zA-Z]+$/',$order_no)){
            return array(
                'code' => 0,
                'data' => array(
                    'error_message' => 'order_no can`t contain special characters'
                )
            );
        }
 
        /*----调用下单api----*/
        \Pingpp\Pingpp::setApiKey(APP_KEY);// 设置 API Key
        \Pingpp\Pingpp::setPrivateKeyPath( __DIR__ . "/certs/your_rsa_private_key.pem");
        try {
            $charge = \Pingpp\Charge::create(
                array(
                    //请求参数字段规则,请参考 API 文档:https://www.pingxx.com/api#api-c-new
                    'subject'   => $subject ? $subject : 'Your Subject',
                    'body'      => $body ? $body : 'Your Body',
                    'amount'    => $amount,//订单总金额, 人民币单位:分(如订单总金额为 1 元,此处请填 100)
                    'order_no'  => $order_no,// 推荐使用 8-20 位,要求数字或字母,不允许其他字符
                    'currency'  => 'cny',
                    'extra'     => $extra,
                    'channel'   => $channel,// 支付使用的第三方支付渠道取值,请参考:https://www.pingxx.com/api#api-c-new
                    'client_ip' => $_SERVER['REMOTE_ADDR'],// 发起支付请求客户端的 IP 地址,格式为 IPV4,如: 127.0.0.1
                    'app'       => array('id' => APP_ID),
                    'description' => $description
                )
            );
        } catch (\Pingpp\Error\Base $e) {
            // 捕获报错信息
            if ($e->getHttpStatus() != NULL) {
                $data = array(
                    'code' => 0,
                    'data' => array(
                        'error_message' => $e->getHttpBody()
                    )
                );
            } else {
                $data = array(
                    'code' => 0,
                    'data' => array(
                        'error_message' => $e->getMessage()
                    )
                );
            }
            return $data;
        }
 
        return array(
            'code' => 1,
            'data' => array(
                'charge' => $charge
            )
        );
    }
 
    //查询charge对象
    public function check_charge($id){
        /*----调用查询api----*/
        \Pingpp\Pingpp::setApiKey(APP_KEY);// 设置 API Key
        try {
            $charge = \Pingpp\Charge::retrieve($id);
            return array(
                'code' => 1,
                'data' => array(
                    'charge' => $charge
                )
            );
        } catch (\Pingpp\Error\Base $e) {
            // 捕获报错信息
            if ($e->getHttpStatus() != NULL) {
                $data = array(
                    'code' => 0,
                    'data' => array(
                        'error_message' => $e->getHttpBody()
                    )
                );
            } else {
                $data = array(
                    'code' => 0,
                    'data' => array(
                        'error_message' => $e->getMessage()
                    )
                );
            }
            return $data;
        }
    }
 
    //Webhooks回调
    public function Webhooks(){
        $row_data = file_get_contents('php://input');
 
        //从头信息获取签名
        $headers = \Pingpp\Util\Util::getRequestHeaders();
        $signature = isset($headers['X-Pingplusplus-Signature']) ? $headers['X-Pingplusplus-Signature'] : NULL;
 
        //验证签名
        $pub_key_path = __DIR__ . "/certs/pingpp_webhooks_public_key.pem"; //Ping++ 公钥
        $pub_key_contents = file_get_contents($pub_key_path);
        $verify_result = openssl_verify($row_data, base64_decode($signature), $pub_key_contents, 'sha256');
 
        if (!$verify_result){
            return array(
                'code' => 0,
                'data' => array(
                    'error_message' => 'signature verify fail',
                    'event' => $row_data
                ),
            );
        } else{
            return array(
                'code' => 1,
                'data' => array(
                    'event' => $row_data
                ),
            );
        }
    }
 
    //批量转账
    public function Batch_transfer($batch_no, $description, $recipients){
        /*----检查参数格式----*/
        if (is_array($recipients) && !empty($recipients)){
            $amount = 0;
            $recipient_array = array();
            foreach ($recipients as $item){
                if (isset($item['account']) && $item['account'] && isset($item['amount']) && $item['amount'] && isset($item['name']) && $item['name']){
                    $recipient_array[] = $item;
                    $amount += $item['amount'];
                }
            }
        } else{
            return array(
                'code' => 0,
                'data' => 'invalid $recipients'
            );
        }
 
        \Pingpp\Pingpp::setApiKey(APP_KEY);// 设置 API Key
        \Pingpp\Pingpp::setPrivateKeyPath( __DIR__ . "/certs/your_rsa_private_key.pem");
        try {
            $batch_transfer = \Pingpp\Batch_transfer::create(
                array(
                    'batch_no'  => $batch_no,
                    'channel'   => 'alipay',
                    'app'       => APP_ID,
                    'amount'    => $amount,//订单总金额, 人民币单位:分(如订单总金额为 1 元,此处请填 100)
                    'currency'  => 'cny',
                    'description' => $description,
                    'type' => 'b2c',
                    'recipients' => $recipient_array,
                )
            );
            return array(
                'code' => 1,
                'data' => array(
                    'batch_transfer' => $batch_transfer
                )
            );
 
        } catch (\Pingpp\Error\Base $e) {
            // 捕获报错信息
            if ($e->getHttpStatus() != NULL) {
                $data = array(
                    'code' => 0,
                    'data' => array(
                        'error_message' => $e->getHttpBody()
                    )
                );
            } else {
                $data = array(
                    'code' => 0,
                    'data' => array(
                        'error_message' => $e->getMessage()
                    )
                );
            }
            return $data;
        }
    }
}

说明:
1. APP_ID和APP_KEY来源:https://www.pingxx.com/docs/overview/config

       2. 文件同级目录下,创建一个certs文件夹,用于存放证书文件,文件结构如图:

           ![image.png](https://upload-images.jianshu.io/upload_images/17851156-1b03bac8ddeb64ff.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


        商户公钥、私钥,Ping++公钥配置路径:登录管理平台,点击管理平台右上角公司名称->企业设置。配置界面如下图:
image.png

————————————————
版权声明:本文为CSDN博主「-_-px」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/px_farmer/article/details/70332044

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342