微信支付統一下單接口開發步驟


在統一下單前需要數據簽名和獲取用戶id詳情可參看另外兩篇文章

http://www.cnblogs.com/itBulls/articles/8645619.html


http://www.cnblogs.com/itBulls/articles/8646375.html

 

統一下單接口

index.php 文件地址

session_start();

include './Base.php';

class WeiXinPay extends Base
{
  
    public function __construct()
    {

    }
}

$obi = new WeiXinPay();

$obi->unifiedOrder();

 

base.php 文件地址

<?php
header("Content-type: text/html; charset=utf-8");
/**
 * Created by PhpStorm.
 * User: lsh
 * Date: 2099/3/25
 * Time: 16:08
 */

class Base
{
    ////支付秘鑰 key
    const KEY ='kkkkksdio87923';
    //獲取code 的微信服務器地址
    const CODEURL = "https://open.weixin.qq.com/connect/oauth2/authorize?";
    //你自己的APPID
    const APPID = 'ssdfqwxx';
    //獲取openid 的微信服務器地址
    const OPENIDURL = 'https://api.weixin.qq.com/sns/oauth2/access_token?';
    //開發者秘鑰
    const SECRET = 'b8sdjfi28379923834';
    //商戶id
    const MCHID = '243926561';
    //統一下單地址
    const UNURL = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
    //不需要用戶確認授權
    const SCOPE = 'snsapi_base';



    //生成簽名
    public function getSign($arr)
    {
        //去除數組中的空值
        $arr = array_filter($arr);
        //如果數組中有簽名刪除簽名
        if(isset($arr['sing']))
        {
            unset($arr['sing']);
        }
        //按照鍵名字典排序
        ksort($arr);
        //生成URL格式的字符串
        //http_build_query()中文自動轉碼需要處理下
        $str = http_build_query($arr)."&key=".self::KEY;
        //echo  $str;
        //appid=dkdfg&body=2347%E4%BA%AC%E4%B8%9C%E5%95%86%E5%9F%8E&mch_id=sdfgd&key=kkkkksdio87923CBEF716EF1A065E6979DE3170BE3B6B8
        $str = $this->arrToUrl($str);
        //echo  $str;
        //header("Content-type: text/html; charset=utf-8");
//       echo  strtoupper(md5($str));
       return  strtoupper(md5($str));
    }

    //獲取簽名 待簽名的數組
    public function setSing($arr)
    {
        $arr['sing'] = $this->getSign($arr);
        return $arr;
    }

    //URL解碼為中文
    public function arrToUrl($str)
    {
        return urldecode($str);
    }
    //驗證簽名
    public function checkSing($arr)
    {
        //獲取簽名
        $sing = $this->getSign($arr);
        if($sing == $arr['sing'])
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    //獲取openid
    public function getOpenId()
    {
        //如果已經獲取到用戶的openId就存儲在session中
        if(isset($_SESSION['openid']))
        {
            return $_SESSION['openid'];
        }
        else
        {
            //1.用戶訪問微信服務器地址 先獲取到微信get方式傳遞過來的code
            //2.根據code獲取到openID
            if(! isset($_GET['code']))
            {
                //沒有獲取到微信返回來的code ,讓用戶再次訪問微信服務器地址

                //redirect_uri 解釋
                //跳轉地址:你發起請求微信服務器獲取code ,
                //微信服務器返回來給你的code的接收地址(通常就是發起支付的頁面地址)

                //組裝跳轉地址
                $redirect_uri = self::CODEURL .'appid='.self::APPID.'&redirect_uri='.$_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'&response_type=code&scope='.self::SCOPE.'&state=STATE#wechat_redirect';

//                echo $redirect_uri;

                //跳轉 讓用過去獲取code
                header("location:{$redirect_uri}");
            }
            else
            {
                //調用接口獲取openId
                $openidurl = self::OPENIDURL.'appid='.self::APPID.'&secret='.self::SECRET.'&code='.$_GET['code'].'&grant_type=authorization_code';

                //請求獲取用戶的openID
                $data = file_get_contents($openidurl);
                $arr = json_decode($data,true);
                //獲取到的openid保存到session 中
                $_SESSION['openid'] = $arr['openid'];

                return $_SESSION;
            }
        }

    }
    //調用統一下單 api
    public function unifiedOrder()
    {
        /**
         * 1.構建原始數據
         * 2.加入簽名
         * 3、將數據轉換為XML
         * 4、發生XML格式的數據到接口地址
         *
         *
         */

        //1.構建原始數據
        $params = array(
            'appid'=>self::APPID,
            'mch_id'=>self::MCHID,
            'nonce_str'=>md5(time()),
            'body'=>'商品描述信息',
            //存儲到數據庫的訂單id
            'out_trade_no'=>1380,
            'total_fee'=>'支付的商品價格',
            //客戶端ip
            'spbill_create_ip'=>$_SERVER['REMOTE_ADDR'],
            //支付結果通知地址(你自己服務器的地址,修改訂單狀態)
            'notify_url'=>'http://www.ccten123.com/notify.php',
            //支付類型
            'trade_type'=>'JSAPI',
            //產品id
            'product_id'=>1380,
            //OPENID
            'openid'=>$this->getOpenId(),
        );
        //2.加入簽名
        $params = $this->setSing($params);
//        echo '<pre>';
//        print_r($params);
        //3.將數據轉換為XML
        $xmlData = $this->ArrToXml($params);
        //記錄到日志查看
        $this->logs('./logs/','sendXmlData.txt',$xmlData);
        //4.發送數據
        $resultData = $this->postXmlOrJson(self::UNURL,$xmlData);
        //接收下單結果 返回格式是xml的
        $resultData = $this->XmlToArr($resultData);
        // 在resultData 中就有微信服務器返回的prepay_id
        return $resultData;

    }
    //獲取prepay_id
    public function getPrePayId()
    {

    }

    //數組轉xml
    public function ArrToXml($arr)
    {
        if(!is_array($arr) || count($arr) == 0) return '';

        $xml = "<xml>";
        foreach ($arr as $key=>$val)
        {
            if (is_numeric($val)){
                $xml.="<".$key.">".$val."</".$key.">";
            }else{
                $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
            }
        }
        $xml.="</xml>";
        return $xml;
    }

    //Xml轉數組
    public function XmlToArr($xml)
    {
        if($xml == '') return '';
        libxml_disable_entity_loader(true);
        $arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        return $arr;
    }

    //日志記錄方法
    public function logs($filePath,$fileName,$data)
    {
        if(is_dir($filePath))
        {
            file_put_contents($filePath.$fileName,$data);
        }
        else
        {
            echo "當前目錄下,目錄".$filePath."不存在";
        }
    }

    //提交XML方法
    public function postXmlOrJson($url,$data)
    {
        //$data = 'XML或者JSON等字符串';
        $ch = curl_init();
        $params[CURLOPT_URL] = $url;    //請求url地址
        $params[CURLOPT_HEADER] = false; //是否返回響應頭信息
        $params[CURLOPT_RETURNTRANSFER] = true; //是否將結果返回
        $params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向
        $params[CURLOPT_POST] = true;
        $params[CURLOPT_POSTFIELDS] = $data;

        //防止curl請求 https站點報錯 禁用證書驗證
        $params[CURLOPT_SSL_VERIFYPEER] = false;
        $params[CURLOPT_SSL_VERIFYHOST] = false;

        curl_setopt_array($ch, $params); //傳入curl參數
        $content = curl_exec($ch); //執行
        curl_close($ch); //關閉連接
        return $content;
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM