APPID = $APPID;
$this->MCHID = $MCHID;
$this->KEY = $KEY;
$this->notify_url = $notify_url;
}
/**
**$order_sn 原订单号
**$order_sn 现订单号
**$totalFee 价格
**$openid
**/
//统一下单调用
public function prePay($order_sn,$order_by_sn, $totalFee, $openid,$ip){
$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
$nonce_str = self::getRandChar_l(32);
$data['appid'] =$this->APPID;
$data['mch_id'] = $this->MCHID;
$data['nonce_str'] = $nonce_str;
$data['body'] = '订单编号:'.$order_sn;
$data['out_trade_no'] = $order_by_sn;
$data['total_fee'] = $totalFee*100;
$data['spbill_create_ip'] =$ip;
$data['notify_url'] = $this->notify_url;
$data['trade_type'] = 'JSAPI';
$data['openid'] = $openid;
$data['sign'] = self::sign($data,$this->KEY);
$xml = self::arrayToXml($data);
$response = self::postXmlCurl($xml, $url);
$array=self::xmlstr_to_array($response);
$wxData = self::wxPay($array['prepay_id'],$this->APPID,$this->KEY);
return $wxData;
}
//微信支付
static function wxPay($prepayId,$APPID,$KEY){
$data['appId'] = $APPID;
$data['nonceStr'] = self::getRandChar_l(32);
$data['package'] = "prepay_id=".$prepayId;
$data['signType'] = 'MD5';
$data['timeStamp'] = time();
$data['sign'] = self::getSign($data,$KEY);
return $data;
}
///生成签名
static function getSign($Obj,$KEY){
foreach ($Obj as $k => $v) {
$Parameters[strtolower($k)] = $v;
}
// 签名步骤一:按字典序排序参数
ksort($Parameters);
$String = "appId=".$Obj['appId']."&nonceStr=".$Obj['nonceStr']."&package=".$Obj['package']."&signType=MD5&timeStamp=".$Obj['timeStamp'];
// 签名步骤二:在string后加入KEY
$String = $String . "&key=" . $KEY;
// 签名步骤三:MD5加密
$result_ = strtoupper(md5($String));
return $result_;
}
// xml转成数组
static function xmlstr_to_array($xmlstr){
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$xmlstring = simplexml_load_string($xmlstr, 'SimpleXMLElement', LIBXML_NOCDATA);
$val = json_decode(json_encode($xmlstring),true);
return $val;
}
// 获取指定长度的随机字符串
protected function getRandChar($length){
$str = null;
$strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
$max = strlen($strPol) - 1;
for ($i = 0; $i < $length; $i ++) {
$str .= $strPol[rand(0, $max)]; // rand($min,$max)生成介于min和max两个数之间的一个随机整数
}
return $str;
}
// 将数组转成uri字符串
static function formatBizQueryParaMap($paraMap, $urlencode){
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v) {
if ($urlencode) {
$v = urlencode($v);
}
$buff .= strtolower($k) . "=" . $v . "&";
}
$reqPar;
if (strlen($buff) > 0) {
$reqPar = substr($buff, 0, strlen($buff) - 1);
}
return $reqPar;
}
// 数组转xml
static function arrayToXml($arr){
$xml = "";
foreach ($arr as $key => $val) {
if (is_numeric($val)) {
$xml .= "<" . $key . ">" . $val . "" . $key . ">";
} else
$xml .= "<" . $key . ">" . $key . ">";
}
$xml .= "";
return $xml;
}
// post https请求,CURLOPT_POSTFIELDS xml格式
static function postXmlCurl($xml, $url, $second = 30){
// 初始化curl
$ch = curl_init();
// 超时时间
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
// 这里设置代理,如果有的话
// curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
// curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
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
$data = curl_exec($ch);
// 返回结果
if ($data) {
curl_close($ch);
return $data;
} else {
$error = curl_errno($ch);
echo "curl出错,错误码:$error" . "
";
echo "错误原因查询";
curl_close($ch);
return false;
}
}
//生成签名
static function sign($Obj,$KEY){
foreach ($Obj as $k => $v) {
$Parameters[strtolower($k)] = $v;
}
// 签名步骤一:按字典序排序参数
ksort($Parameters);
$String = self::formatBizQueryParaMap($Parameters, false);
// 签名步骤二:在string后加入KEY
$String = $String . "&key=" . $KEY;
// 签名步骤三:MD5加密
$result_ = strtoupper(md5($String));
return $result_;
}
// 获取指定长度的随机字符串
static function getRandChar_l($length){
$str = null;
$strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
$max = strlen($strPol) - 1;
for ($i = 0; $i < $length; $i ++) {
$str .= $strPol[rand(0, $max)]; // rand($min,$max)生成介于min和max两个数之间的一个随机整数
}
return $str;
}
}