在統一下單前需要數據簽名和獲取用戶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; } }