<?php class wxPay { /* 微信jsapi支付相關配置 */ protected $key = 'c2a7d232222222222e795'; //商戶號API KEY 在商戶後臺設置 protected $appid = 'wxbb82111119f5e5f04'; //公衆號appid protected $mchid = '11111111'; //商戶號 /* 微信JSAPI支付 body out_trade_no 外部訂單號 (本身生成的訂單號) total_fee 支付的金額 notify_url 支付成功後的回調 openid 用戶對應公衆號的openid */ public function jsApiPay($params) { $postData = array(); $postData['appid'] = $this->appid; $postData['mch_id'] = $this->mchid; $postData['nonce_str'] = $this->createNoncestr(); $postData['body'] = $params['body']?$params['body']:'jsapi支付'; $postData['out_trade_no'] = $params['out_trade_no']; $postData['total_fee'] = $params['total_fee']; $postData["spbill_create_ip"] = $_SERVER["REMOTE_ADDR"]; $postData['notify_url'] = $params['notify_url']; $postData['trade_type'] = 'JSAPI'; $postData['openid'] = $params['openid']; $postData["sign"] = $this->createSign($postData); //把數組轉化成xml格式 $xmlData = $this->arrayToXml($postData); $resXml = $this->curl_post('https://api.mch.weixin.qq.com/pay/unifiedorder', $xmlData); $resData = json_decode(json_encode(simplexml_load_string($resXml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); if($resData['return_code']!='SUCCESS' || $resData['result_code']!='SUCCESS') return false; // 生成正式支付參數 $data = array( 'appId'=> $resData['appid'], 'nonceStr'=> $resData['nonce_str'], 'package'=> "prepay_id=" . $resData['prepay_id'], 'signType'=> 'MD5', 'timeStamp'=> time(), ); //支付簽名 $data['paySign'] = $this->createSign($data); return $data; } //生成簽名 private function createSign($params) { //簽名步驟一:按字典序排序參數 ksort($params); $String = $this->formatBizQueryParaMap($params, false); //簽名步驟二:在string後加入KEY $String = $String."&key=".$this->key; //簽名步驟三:MD5加密 $String = md5($String); //簽名步驟四:全部字符轉爲大寫 $result_ = strtoupper($String); return $result_; } //按字典序排序參數 private function formatBizQueryParaMap($params,$urlencode=false) { ksort($params); $buff = ''; foreach($params as $key=>$val) { $buff .= $key . "=" . $val . "&"; } $reqPar = substr($buff, 0, strlen($buff)-1); return $reqPar; } //將數組轉換爲xml格式 private function arrayToXml($arr) { $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; } //隨機字符串 private function createNoncestr($length=32) { $chars = 'abcdefghijklmnopqrstuvwxyz0123456789'; $str = ''; for($i=0;$i<$length;$i++){ $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1); } return $str; } } //調用 $obj = new wxPay() $params = array(); $params['out_trade_no'] = date('YmdHis'); $params['total_fee'] = 100; $params['notify_url'] = 'http://www.xxx.com/mobile/notify.php'; $params['openid'] = 'ouD322auhn9o5m-8'; $res = $obj->jsApiPay($params); ?>
若是一直報簽名錯誤, 能夠先到簽名工具裏對簽名進行驗證。 若是在簽名工具裏校驗簽名是正確的,那頗有多是api key的問題,從新在商戶後臺 ,設置一下api key,通常就能夠正常了php