在微信小程序调用微信支付接口的时候,需要做一个准备工作,必须先获取到用户的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;
}
}