Yii2(PHP) 對接 ping++支付接口

ping++是一個第三方接口,官網:https://www.pingxx.com

github:    https://github.com/PingPlusPlus/pingpp-php

我用到的wechat的公衆號支付 和 alipay  ,主要的邏輯:

先在後臺控制器接收到前端發送過來的channel,然後,調用 pay() 函數。

        public static function pay($money,$orderNo,$channel)
        {

            $api_key = Yii::$app->params[‘API_KEY‘];
            $app_id = Yii::$app->params[‘PAPP_ID‘];

            //引入你的签名私钥
            $path = dirname(dirname(__FILE__)).‘/components/pingpp/rsa_private_key.pem‘;
            \Pingpp\Pingpp::setPrivateKeyPath($path);

            //$extra用于设置支付渠道所需的额外参数,额外参数多数是可选,请根据需求来决定。详情看参考文档
            $extra = [];

            switch ($channel) {
                case ‘alipay_wap‘:
                    $extra = array(
                        // success_url 和 cancel_url 在本地测试不要写 localhost ,请写 127.0.0.1。URL 后面不要加自定义参数
                        ‘success_url‘ =>Yii::$app->request->getHostInfo().‘/‘. Yii::$app->params[‘pay_success_url‘],
                        ‘cancel_url‘ => Yii::$app->request->getHostInfo().‘/‘.Yii::$app->params[‘pay_cancel_url‘],
                    );
                    break;
            case ‘wx_pub‘:
                    $cookies = Yii::$app->request->cookies;
                    $wx_code = $cookies->getValue(‘wx_code‘);  //下面有將怎麼獲取
                    $wx_app_id = Yii::$app->params[‘wechat‘][‘wx_app_id‘];
                    $wx_app_secret = Yii::$app->params[‘wechat‘][‘wx_app_secret‘];
                    $open_id = WxpubOAuth::getOpenid($wx_app_id, $wx_app_secret, $wx_code);
                    $extra = array(
                        ‘open_id‘ => $open_id// 用户在商户微信公众号下的唯一标识,获取方式可参考 pingpp-php/lib/WxpubOAuth.php
                    );
                    break;
            }

            \Pingpp\Pingpp::setApiKey($api_key); //设置API-KEY

            try {
                //create方法表示发送支付请求到ping++平台,$ch表示请求成功时返回的charge对象(json格式),服务器端如果发起请求成功,此时只需要把charge对象传递给APP客户端,交给客户端处理
                $ch = \Pingpp\Charge::create([
                        ‘subject‘   => ‘標題‘, //关于这些参数的意义,请参考文档https://www.pingxx.com/api#api-c-new
                        ‘body‘      => ‘內容‘,
                        ‘amount‘    => $money,
                        ‘order_no‘  => $orderNo,
                        ‘currency‘  => ‘cny‘,    //货币代码
                        ‘extra‘     => $extra,
                        ‘channel‘   => $channel,
                        ‘client_ip‘ => $_SERVER[‘REMOTE_ADDR‘],
                        ‘app‘       =>  [‘id‘ => $app_id]
                ]);

                return $ch;

            } catch (\Pingpp\Error\Base $e) { //如果发起支付请求失败,则抛出异常
                // 捕获报错信息
                if ($e->getHttpStatus() != NULL) {
                    header(‘Status: ‘ . $e->getHttpStatus());
                    echo $e->getHttpBody();
                } else {
                    echo $e->getMessage();
                }
            }

        }

wx_code的獲取:

 /**
     * 判断是否在微信客户端打开链接
     * 如果是就跳转到微信code的重定向url地址
     * 如果不是就跳到支付宝支付界面
     */

    public function actionGetcode()
    {
        $isWechat = Helper::isWechatBrowser();if($isWechat){
            $url = Helper::GetWxCodeUrl();
            header("Location: $url");
            exit();
        } else {
            $this->redirect([‘order/payment‘]);
        }
    }

    /**
     * 通过微信重定向url获取code,
     * 并且把code设置为cookie
     */

    public function actionGetwxcode()
    {
        $code = Yii::$app->request->get(‘code‘);if(!empty($code)){
            $cookies = Yii::$app->response->cookies;
            $cookies->add(new \yii\web\Cookie([
                ‘name‘ => ‘wx_code‘,
                ‘value‘ => $code,
                ‘expire‘=>time()+3600,
            ]));
        }

        $this->redirect([‘/order/payment‘]);
    }

Helper.php

        /**
         * 判断是否微信打开
         * @return boolean
         */
        public static function isWechatBrowser()
        {
            if (strpos($_SERVER[‘HTTP_USER_AGENT‘],‘MicroMessenger‘) !== false ) {
                return true;
            }

            return false;
        }

        /**
         * 获取微信code的重定向前的url
         * @return string
         */
        public static function GetWxCodeUrl()
        {
            $wx_app_id = Yii::$app->params[‘wechat‘][‘wx_app_id‘];
            $redirect_url = Yii::$app->params[‘wechat‘][‘redirect_url‘];
            $code_url = WxpubOAth::createOauthUrlForCode($wx_app_id, $redirect_url);  //WxpubOAth這個類在pingpp\lib\WxpubOAth.php裏面

            return $code_url;
        }

然後,再看前端

$("#pay").click(function(){
        var pay_way = $("input[type=‘radio‘]:checked").val();
        if(pay_way == 1){
            wap_pay(1) //支付寶支付
        }else if(pay_way == 2){
            wap_pay(2) //微信支付
        }else if(pay_way == 3){
            paypal_pay() //PayPal支付
        }
    });

wap_way :

function wap_pay(channel) {
        if(url.length == 0 || !url.startsWith(‘http‘)){
            alert("请填写正确的URL");
            return;
        }

        var xhr = new XMLHttpRequest();
        xhr.open("POST", url, true);
        xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8");
        xhr.send("channel="+channel+"&ssid="+ssid+"&_csrf="+_csrf);
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4 && xhr.status == 200) {
                console.log(xhr.responseText);
                pingpp.createPayment(xhr.responseText, function(result, err) {
                    console.log(result);
                    console.log(err.msg);
                    console.log(err.extra);
                    if (result == "success") {
                        // 只有微信公众账号 wx_pub 支付成功的结果会在这里返回,其他的支付结果都会跳转到 extra 中对应的 URL。
                        window.location.href = "<?php echo Url::to(‘/order/success‘)?>";
                    } else if (result == "fail") {
                        // charge 不正确或者微信公众账号支付失败时会在此处返回
                        window.location.href = "<?php echo Url::to(‘/order/cancel‘)?>";
                    } else if (result == "cancel") {
                        // 微信公众账号支付取消支付
                        window.location.href = "<?php echo Url::to(‘/order/cancel‘)?>";
                    }
                });
            }
        }
    }
时间: 2024-08-11 10:10:39

Yii2(PHP) 對接 ping++支付接口的相关文章

说说第三方支付接口开发及开发中遇到的坑爹问题

前言 最近在做公司的支付接口,从微信支付到各种第三方的支付接口,还有点卡等支付,微信支付文档相对比较详细,虽然也不少坑,被各路开发人员吐槽,但是填的人多啊,所以是最好开发的,但是公司还有用到一些第三方的网页支付接口,然后遇到很多坑,忍不住想吐槽一下. 一.第三方支付流程 各种支付的文档,业务流程图有的过于简单,有的真的是复杂的不要不要的,开发者看了也是醉,写这些文档的人好像从来不会考虑看的人的感受,所以我觉得有必要在这里简单介绍,我觉得给开发者的流程图大致应该是这样的,而不是一堆用不上的东西在开

个人网站如何选择支付接口(API回调)

本人持续关注"个人网站支付接口"这个话题已久,期间也开发.对接过很多支付方的接口,如Paypal.支付宝.微信.环迅等.终于决定花点时间写一款WordPress付费阅读工具然后写几篇相关的文章.当然跟近期盛传的"内容付费时代来了"没有关系(Are you sure about that?),"来没来"还是交给那些自媒体人和专家去争论吧.本篇文章的目的,是向正在寻求个人网站支付方案的开发者朋友们提供一些信息,协助他们决策.读完后有些方向就不用去考虑

關於php接ICBC的支付接口的解決方案

一:背景: 目前項目使用的是php語言開發,需要接入中國工商銀行的ICBC的線上支付接口. 二:遇到的問題:支付時需要對數據簽名,但是銀行那邊不提供php版本的程序,只有java版本的,以下是對接人回復的郵件: 三:思路: 目前大概有3種解決方案: 1.  通過使用一個叫 php-java-bridge 的插件,在php中調用java的函數 2. 把java的函數改寫成php版本 3. 在服務器配置javaWeb環境,通過http請求把簽名的參數傳入,從而獲取簽名 四: 具體做法: 我採取的是第

UnionPay,ChinaPay 最新 银联支付接口C#\Asp.net\MVC 版本

1.概念普及 一.理解什么是UnionPay.ChinaPay 这两个概念如果搞不清楚,绝对够你瞎折腾一段时间的. UnionPay:中国银联,最大的机构:他本身也提供系统接口但都是B2B的,对于单个商户他们不提供客服,也不提供技术解决,更不会提供商户后台(可查消费记录等):但他的技术接口文档比较齐全,而且也可以使用,警惕不要使用这些接口. ChinaPay:银联电子支付公司,第三方的支付公司,UnionPay的所有接口和服务都托管给类似的第三方公司,ChinaPay再向商户服务,ChinaPa

【Java EE 学习 21 下】【 使用易宝支付接口实现java网上支付功能】

一.网上支付分为两种情况,一种方法是使用直接和银行的支付接口,另外一种方法是使用第三方支付平台和银行对接完成支付. 1.直接和银行对接. 2.使用第三方支付平台 3.常见的第三方支付平台 二.使用易宝支付接口实现java网上支付功能(农业银行). 1.完整源代码:https://github.com/kdyzm/day21_2_pay 2.实现过程的时序图 3.技术要点 (1)使用GET请求的时候必须将全部参数都带上,参数名称参考开发者文档中的请求参数列表 (2)使用PaymentUtil类实现

PHP商城网站绑定中国银联在线支付接口

PHP商城网站绑定中国银联在线支付接口用的越来越广泛,我们公司这几年给客户建立过很多的商城网站,今天就分析下怎么为自己的PHP商城网站接入中国银联在线支付端的接口.在使用前我们必须先申请成为中国银联在线支付的商户. 第一步:下载中国银联官方PHP支付接口文件 进入中国银联在线官方网站的商户服务网站,下载PHP的技术资料端口文件(https://online.unionpay.com/mer/pages/merser/index.jsp这是中国银联在线支付商户服务网站),点击右上角的“文档下载”

API开发第五篇:服务端整合支付宝快捷移动支付接口

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>在开发中需要使用支付宝的快捷移动支付接口,通过文档知道,当完成客户端请求完成后,支付宝服务器会异步通知客户端的服务器.这里的关键是提供给支付宝的这个用于异步通知的con

如何接入中国工商银行网上银行B2C在线支付接口

中国工商银行网上银行B2C在线支付接口说明,亲测可行. 工具/原料 merID:银行提供.唯一确定一个商户的代码,由商户在工行开户时,由工行告知商户. merAcct:银行提供 , 商城收费入账账号 (只能交易时指定). 懂得html代码跟PHP的程序员一名 方法/步骤 1 到银行开户,说明要做B2C在线支付接口,此时银行会提供给你 merID  .merAcct  这两个 2 由程序员按照一下步骤来做即可,在商城提交表单的页面添加以下控件. 3 <html xmlns=http://www.w

【网站国际化必备】Asp.Net MVC 集成Paypal(贝宝)快速结账 支付接口 ,附源码demo

开篇先给大家讲段历史故事,博主是湖北襄阳人.襄阳物华天宝,人杰地灵,曾用名襄樊.在2800多年的历史文化中出现了一代名相诸葛亮(卧龙),三国名士庞统(凤雏),魏晋隐士司马徽(水镜先生),唐代大诗人孟浩然(孟襄阳),张继.杜审言,文学家皮日休,北宋著名书画家米芾(米襄阳),“允冠百王”的光武帝刘秀,东方圣人释道安等一大批历史文化名人.小说<三国演义>120回故事中有30多回提到襄阳. 相传诸葛亮的老婆黄月英黄头发黑皮肤,但知识广博.诸葛亮发明木牛流马,就是从黄月英的传授的技巧上发展出来.不仅如此