微信扫码支付

12/12/2017

直接上源码:

/**
* 微信二维码扫码支付
*
* @date 2017-12-12
* @author jerry.cao (caowlong163@163.com)
*/

header(“content-type:text/xml;charset=utf-8″);
ini_set(‘date.timezone’,’Asia/Shanghai’);

class WxQrPay
{
private $sign = ”; // 签名字符串
private $spbillCreateIp = ”; // 终端IP
private $nonceStr = ”; // 随机字符串,32位以内
private $notifyUrl = ”; // 通知地址,即公众平台开发设置中设置的支付回调URL
private $timeout = 10; // 超时时间,秒
private $appId = ‘wx426b3015555a46be’; // 公众号APPID
private $mchId = ‘1900009851’; // 商户号
private $tradeType = ‘NATIVE’; // 交易类型,网页扫码NATIVE
private $signatureKey = ‘6efbd4ba9f844d2b932882aea9e81caf’; // 签名所需要的密钥
private $orderUrl = ‘https://api.mch.weixin.qq.com/pay/unifiedorder’; // 统一下单URL

// 初使化变量
public function __construct()
{
$this->nonceStr = $this->getRandomStr();
$this->spbillCreateIp = $this->getIP();
}

/**
* 获取二维码地址
*
* @param array $data
* @return array
*/
public function getQrUrl($data)
{
$params = array(
‘appid’ => $this->appId,
‘mch_id’ => $this->mchId,
‘body’ => $data[‘body’], // 商品描述
‘nonce_str’ => $this->nonceStr,
‘notify_url’ => $this->notifyUrl,
‘out_trade_no’ => $data[‘tradeNo’], // 商户订单号
‘spbill_create_ip’ => $this->spbillCreateIp,
‘total_fee’ => $data[‘totalFee’], // 总金额,单位为【分】,参数值不能带小数
‘trade_type’ => $this->tradeType,
);

if (empty($params[‘body’]) || empty($params[‘out_trade_no’]) || empty($params[‘total_fee’])) {
die(‘Params error’);
}

$params[‘sign’] = $this->getSignature($params);

$xmlData = $this->arrayToXml($params);

/** 向微信服务器发送数据 **/
try {
$response = $this->postCurl($xmlData);
} catch (Exception $e) {
die(‘Pay failed’);
}

return $response;
}

/**
* POST统一下单
*
*/
private function postCurl($xmlData)
{
// 首先检测是否支持curl
if (!extension_loaded(“curl”)) {
die(“Call to undefined function curl!”);
}

// 初始curl会话
$ch = curl_init();

// 设置curl在成功连接服务器前等待多久,如果设置为0,则无限
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $this->timeout);

// 设置curl从服务器接收缓冲完成前需要等待多长时间即总执行动作的最长秒数,如果设置为0,则无限
curl_setopt ($ch, CURLOPT_TIMEOUT, $this->timeout*3);

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验

// 设置header
curl_setopt($ch, CURLOPT_HEADER, FALSE);

// 设置curl默认访问为IPv4
if (defined(‘CURLOPT_IPRESOLVE’) && defined(‘CURL_IPRESOLVE_V4’)) {
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
}

// 设置url
curl_setopt($ch, CURLOPT_URL, $this->orderUrl);

// 设置发送方式:
curl_setopt($ch, CURLOPT_POST, true);
// curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); // 是否将CRUL获取的内容赋值到变量

// 设置发送数据
curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlData);

$data = curl_exec($ch);

//返回结果
if ($data) {
curl_close($ch);
return $data;
} else {
$error = curl_errno($ch);
curl_close($ch);
throw new Exception(“curl出错,错误码:$error”);
}
}

/**
* 获取签名
*
* $param string 签名所需要的数组数据
*/
private function getSignature($data)
{
$Parameters = array();
foreach ($data as $k => $v) {
$Parameters[$k] = $v;
}

// 按字典序排序参数
ksort($Parameters);

// 格式化参数
$String = $this->ToUrlParams($Parameters, false);

// 加入KEY
$String = $String.”&key=”.$this->signatureKey;

// MD5加密
$String = md5($String);

// 所有字符转为大写
$result = strtoupper($String);

return $result;
}

/**
* 格式化参数,签名过程需要把各个参数按规则组合
*
* @param array $paraMap
* @return string
*/
private function ToUrlParams($paramMap)
{
$buff = “”;
foreach ($paramMap as $k => $v) {
if($k != “sign” && $v != “” && !is_array($v)){
$buff .= $k . “=” . $v . “&”;
}
}

$buff = trim($buff, “&”);

return $buff;
}

/**
* 数组转化xml
*
* @param array $arr
* @return string
*/
private function arrayToXml($arr)
{
$xml = “”;
foreach ($arr as $key=>$val) {
if (is_numeric($val)) {
$xml.=”<“.$key.”>”.$val.””;
} else {
$xml.=”<“.$key.”> }
}
$xml.=””;

return $xml;
}

/**
* xml转化数组
*
* @param string $xml
* @return array
*/
private function xmlToArray($xml)
{
libxml_disable_entity_loader(true);
return json_decode(json_encode(simplexml_load_string($xml, ‘SimpleXMLElement’, LIBXML_NOCDATA)), true);
}

/**
* 获取指定长度的随机字符串
*
* @param int $length 长度
* @return string
*/
private function getRandomStr($length = 32)
{
$chars = ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789’;

$string = ”;
for ($i = 0; $i < $length; $i++) {
$string .= $chars[ mt_rand(0, strlen($chars) – 1) ];
}

return $string;
}

/**
* 获取IP
*
* @param void
* @return string
*/
private function getIP()
{
if (isset($HTTP_SERVER_VARS[“HTTP_X_FORWARDED_FOR”]) && $HTTP_SERVER_VARS[“HTTP_X_FORWARDED_FOR”]) {
$ip = $HTTP_SERVER_VARS[“HTTP_X_FORWARDED_FOR”];
} elseif (isset($HTTP_SERVER_VARS[“HTTP_CLIENT_IP”]) && $HTTP_SERVER_VARS[“HTTP_CLIENT_IP”]) {
$ip = $HTTP_SERVER_VARS[“HTTP_CLIENT_IP”];
} elseif (isset($HTTP_SERVER_VARS[“REMOTE_ADDR”]) && $HTTP_SERVER_VARS[“REMOTE_ADDR”]) {
$ip = $HTTP_SERVER_VARS[“REMOTE_ADDR”];
} elseif (getenv(“HTTP_X_FORWARDED_FOR”)) {
$ip = getenv(“HTTP_X_FORWARDED_FOR”);
} elseif (getenv(“HTTP_CLIENT_IP”)) {
$ip = getenv(“HTTP_CLIENT_IP”);
} elseif (getenv(“REMOTE_ADDR”)) {
$ip = getenv(“REMOTE_ADDR”);
} else {
$ip = ”;
}
return $ip;
}
}

具体请下载源码看详细

源码:WxQrPay.zip