tp5 封装微信APP、JSAPI预支付信息
admin
2023-06-15 11:42:05
0

namespace Potting;


class WechatPay

{

    private static $mchid='';

    private static $appid='';

    private static $key='';

    //生成微信APP预支付信息

    public static function createJsBizPackage($totalFee, $outTradeNo, $orderName, $notifyUrl.$timestamp){

        $unified = array(

            'appid' => self::$appid,

            'attach' => '支付',

            'body' => $orderName,

            'mch_id' => self::$mchid,

            'nonce_str' => self::createNonceStr(),

            'notify_url' => $notifyUrl,

            'out_trade_no' => $outTradeNo,

            'spbill_create_ip' => '127.0.0.1',

            'total_fee' => intval($totalFee * 100),

            'trade_type' => 'APP',

        );

        $unified['sign'] = self::getSign($unified);

        $responseXml = self::curlPost('https://api.mch.weixin.qq.com/pay/unifiedorder', self::arrayToXml($unified));

        $unifiedOrder = (array)simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);

        if ($unifiedOrder === false) {

            die('parse xml error');

        }

        if ($unifiedOrder['return_code'] != 'SUCCESS') {

            die($unifiedOrder['return_msg']);

        }

        if ($unifiedOrder['result_code'] != 'SUCCESS') {

            die($unifiedOrder['err_code']);

        }

        $arr = array(

            "appid" => self::$appid,

            'partnerid'=>self::$mchid,

            "timestamp" => $timestamp,

            "noncestr" => $unifiedOrder['nonce_str'],

            "package" => 'Sign=WXPay',

            "prepayid"=>$unifiedOrder['prepay_id'],

        );

        $data['paySign'] = self::getSign($arr);

        $data['appId']=self::$appid;

        $data['timeStamp']=$timestamp;

        $data['nonceStr']=$unifiedOrder['nonce_str'];

        $data['prepay_id']=$unifiedOrder['prepay_id'];

        $data['trade_type']=$unifiedOrder['trade_type'];

        $data['mchid']=self::$mchid;

        return $data;

    }

    //生成微信JSAPI预支付信息

    public static function createJsBizPackage($openid, $totalFee, $outTradeNo, $orderName, $notifyUrl, $timestamp){

        $unified = array(

            'appid' => self::$appid,

            'attach' => $orderName,

            'body' => $orderName,

            'mch_id' => self::$mchid,

            'nonce_str' => self::createNonceStr(),

            'notify_url' => $notifyUrl,

            'openid' => $openid,

            'out_trade_no' => $outTradeNo,

            'spbill_create_ip' => '127.0.0.1',

            'total_fee' => intval($totalFee * 100),

            'trade_type' => 'JSAPI',

        );

        $unified['sign'] = self::getSign($unified, self::$key);

        $responseXml = self::curlPost('https://api.mch.weixin.qq.com/pay/unifiedorder', self::arrayToXml($unified));

        $unifiedOrder = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);

        if ($unifiedOrder === false) {

            die('parse xml error');

        }

        if ($unifiedOrder->return_code != 'SUCCESS') {

            die($unifiedOrder->return_msg);

        }

        if ($unifiedOrder->result_code != 'SUCCESS') {

            die($unifiedOrder->err_code_des);

        }

        $arr = array(

            "appId" => self::$appid,

            "timeStamp" => $timestamp,

            "nonceStr" => self::createNonceStr(),

            "package" => "prepay_id=" . $unifiedOrder->prepay_id,

            "signType" => 'MD5',

        );

        $arr['paySign'] = self::getSign($arr, self::$key);

        return $arr;

    }


    //微信支付回调

    public static function actionNotify($postStr){

        $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

        if ($postObj === false) {

            die('parse xml error');

        }

        if ($postObj->return_code != 'SUCCESS') {

            die($postObj->return_msg);

        }

        if ($postObj->result_code != 'SUCCESS') {

            die($postObj->err_code);

        }

        //验证签名

        $arr = (array)$postObj;

        unset($arr['sign']);

        if (self::getSign($arr,self::$key) != $postObj->sign) {

            die("签名错误");

        }


        //支付处理正确-判断是否已处理过支付状态

        //$orders = Order::find()->where(['uid'=>$postObj->openid, 'oid'=>$postObj->out_trade_no, 'status' => 0])->all();

        // if(count($orders) > 0){

        //     //更新订单状态

        //     foreach ($orders as $order) {

        //         //更新订单

        //         $order['status'] = 1;

        //         $order->update();

        //     }

        //     return '';

        // } else {

        //     //订单状态已更新,直接返回

        //     return '';

        // }

    }


    public static function curlGet($url = '', $options = array()){

        $ch = curl_init($url);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($ch, CURLOPT_TIMEOUT, 30);

        if (!empty($options)) {

            curl_setopt_array($ch, $options);

        }

        //https请求 不验证证书和host

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

        $data = curl_exec($ch);

        curl_close($ch);

        return $data;

    }



    public static function curlPost($url = '', $postData = '', $options = array()){

        if (is_array($postData)) {

            $postData = http_build_query($postData);

        }

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($ch, CURLOPT_POST, 1);

        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

        curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数

        if (!empty($options)) {

            curl_setopt_array($ch, $options);

        }

        //https请求 不验证证书和host

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

        $data = curl_exec($ch);

        curl_close($ch);

        return $data;

    }


    public static function createNonceStr($length = 16){

        $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

        $str = '';

        for ($i = 0; $i<$length; $i++){

            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);

        }

        return $str;

    }


    public static function arrayToXml($arr){

        $xml = "";

        foreach ($arr as $key => $val){

            if (is_numeric($val)) {

                $xml .= "<" . $key . ">" . $val . "";

            } else {

                $xml .= "<" . $key . ">";

            }

        }

        $xml .= "";

        return $xml;

    }


    public static function getSign($params){

        ksort($params, SORT_STRING);

        $unSignParaString = self::formatQueryParaMap($params, false);

        $signStr = strtoupper(md5($unSignParaString . "&key=" . self::$key));

        return $signStr;

    }


    protected static function formatQueryParaMap($paraMap, $urlEncode = false){

        $buff = "";

        ksort($paraMap);

        foreach ($paraMap as $k => $v){

            if (null != $v && "null" != $v) {

                if ($urlEncode) {

                    $v = urlencode($v);

                }

                $buff .= $k . "=" . $v . "&";

            }

        }

        $reqPar = '';

        if (strlen($buff)>0) {

            $reqPar = substr($buff, 0, strlen($buff) - 1);

        }

        return $reqPar;

    }


}


相关内容

热门资讯

伊朗伊斯兰革命卫队:过去24小... △霍尔木兹海峡(资料图)当地时间26日晚间,伊朗伊斯兰革命卫队海军公共关系部发布消息称,过去24小时...
AI公司烧不起Token了!国... 新智元报道 【新智元导读】4个月烧光全年AI预算,天价Token账单正在屠杀硅谷!今天,高性能Ag...
消息称AMD苏姿丰布局Zen ... 来源:市场资讯 (来源:IT之家) IT之家 5 月 26 日消息,工商时报昨日(5 月 25 日)...
伊朗总统:毫不动摇捍卫领土与国... 当地时间5月26日,伊朗总统佩泽希齐扬发表讲话时表示,伊朗向伊斯兰国家伸出了“兄弟般的友谊之手”。与...
气象科普课堂搬进学校,高要首个... 近日,高要区气象局与高要区第一中学完成校园气象站共建并开展首场气象科普培训,将气象科普课堂搬进学校,...
2026年济南科技活动周正式启... 5月26日上午,2026年济南科技活动周启动仪式暨全国科技工作者日(槐荫)主场活动在山东科技会堂隆重...
凤凰晚报丨投毒杀人者、 三体公... 今日人物【风暴眼丨中国版“绝命毒师”伏法!揭秘三体原CEO许垚投毒轨迹】“三体公司”原CEO许垚,被...
大润发创始人尹衍樑逝世,享年7... 5月26日,润泰集团证实,润泰集团总裁、唐奖创办人、大润发创始人尹衍樑,于2026年5月26日凌晨4...
全国科技工作者日 |市科协搭台... 科技创新是很多中小企业的“短板”,为帮助企业解决技术难题,5月20日,泰州市科协组织“工博士”科技服...
LLC磁集成变压器厂家梳理 新... 导语:LLC磁集成变压器作为高频变压器领域的技术分支,凭借高功率密度、低损耗等特性,成为新能源、工业...