在微信小程序調用微信支付接口的時候,需要做一個準備工作,必須先獲取到用戶的openid,如果沒有獲取用戶openid的朋友可以看看我的另外一篇文章。然后我們開始正式進入主題。以下代碼只需要你換一下appid,密鑰,那些就能直接使用
class Dailipay?
{
private functioncreate Noncestr($length=32) {
$chars="abcdefghijklmnopqrstuvwxyz0123456789";
$str="";
for($i=0;$i<$length;$i++) {
$str.=substr($chars,mt_rand(0,strlen($chars) -1),1);
}
return$str;
}
?public function num()
{
rand(0, 999));
mt_srand((double)microtime() *1000000);
return'CZ'.date('Ymd') .str_pad(mt_rand(1,999999),6,'0',STR_PAD_LEFT);
}
public function pay(){
$d['user_id'] = I('get.user_id');//用戶的openid
$money = I('get.price');//要付款的金額
$appid='';//小程序id
$mch_id='';//商戶id
$key='';這個是API密鑰,也可以說商戶密鑰
$url='https://api.mch.weixin.qq.com/pay/unifiedorder';
$parameters= [
'appid'=>$appid,
'mch_id'=>$mch_id,//商戶號
'nonce_str'=>$this-> createNoncestr(),//隨機字符串
'body'=>'購買費用',//商品描述
'out_trade_no'=>,//商戶訂單號這個就是自己生成的訂單號
'total_fee'=>floatval($money*100),//總金額 單位 分
'spbill_create_ip'=>'',//終端IP就是你的服務器ip
'notify_url'=>'http://www.weixin.qq.com/wxpay/pay.php',//通知地址
'openid'=>$user_id,//用戶id
'trade_type'=>'JSAPI'//交易類型
];
$parameters['sign'] =$this->getSign($parameters,$key);
$xmlData=$this-> arrayToXml($parameters);
$re=$this->xmlToArray($this->postXmlCurl($xmlData,$url,60));
$parameters= ['appId'=>$appid,//小程序ID
? ? ? ? ? ? ? ? ? ? ? ? ?'timeStamp'=>''.time() .'',//時間戳
? ? ? ? ? ? ? ? ? ? ? ? ? 'nonceStr'=>$this-> createNoncestr(),//隨機串
? ? ? ? ? ? ? ? ? ? ? ? ? 'package'=>'prepay_id='.$re['prepay_id'],//數據包
? ? ? ? ? ? ? ? ? ? ? ? ? ?'signType'=>'MD5'//簽名方式
? ? ? ? ? ? ? ? ? ? ? ?];
//簽名
$parameters['paySign'] =$this->getSign($parameters,$key);
echo json_encode($parameters,JSON_UNESCAPED_UNICODE);
}
private? functionpost XmlCurl($xml,$url,$second=30) {
$ch=curl_init();
//設置超時
curl_setopt($ch,CURLOPT_TIMEOUT,$second);
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
//嚴格校驗
//設置header
curl_setopt($ch,CURLOPT_HEADER,FALSE);
//要求結果為字符串且輸出到屏幕上
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
//post提交方式
curl_setopt($ch,CURLOPT_POST,TRUE);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,20);
curl_setopt($ch,CURLOPT_TIMEOUT,40);
set_time_limit(0);
//運行curl
$data = curl_exec($ch);
//返回結果
if($data) {
curl_close($ch);
return $data;
}else{
$error=curl_errno($ch);
curl_close($ch);
throw new WxPayException("curl出錯,錯誤碼:$error");
}
}
private functionxmlToArray($xml) {
//禁止引用外部xml實體
libxml_disable_entity_loader(true);
$xmlstring=simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
$val=json_decode(json_encode($xmlstring),true);
return $val;
}
private function arrayToXml($arr) {
$xml="";
foreach($arras$key=>$val) {
if(is_array($val)) {
$xml.="<".$key.">". arrayToXml($val) ."";
}else{
$xml.="<".$key.">".$val."";
}
}
$xml.="";
return $xml;
}
private function getSign($Obj,$key) {
foreach($Objas$k=>$v) {
$Parameters[$k] =$v;
}
//簽名步驟一:按字典序排序參數
ksort($Parameters);
$String=$this-> formatBizQueryParaMap($Parameters,false);
//簽名步驟二:在string后加入KEY
$String=$String."&key=".$key;
//簽名步驟三:MD5加密
$String=md5($String);
//簽名步驟四:所有字符轉為大寫
$result_=strtoupper($String);
return$result_;
}
private function formatBizQueryParaMap($paraMap,$urlencode) {
$buff="";
ksort($paraMap);
foreach($paraMapas$k=>$v) {
if($urlencode) {
$v=urlencode($v);
}
$buff.=$k."=".$v."&";
}
$reqPar;
if(strlen($buff) >0) {
$reqPar=substr($buff,0,strlen($buff) -1);
}
return$reqPar;
}
}