首页 » PHP笔记 » PHP服务端微信扫码支付

PHP服务端微信扫码支付

高蒙 2019/03/26 11:38 477浏览 0评论


偶尔会遇到使用微信扫一扫二维码的支付功能,下面记录下基本的操作方法。

// 微信扫码支付生成二维码
public function wxcode()
{
	$d['appid'] = $this->wxappid;
	$d['mch_id'] = $this->wxmch_id;
	$d['time_stamp'] = time();
	$d['nonce_str'] = \Org\Util\String::randString(20);
	$d['product_id'] = 'wxpay001';
	$d['sign'] = $this->_getwxsign($d);
	$url = 'weixin://wxpay/bizpayurl?' . http_build_query($d);
	echo $url;
	# ....生成二维码自己完成喽
}

// 微信扫码支付回调参数
public function wxcodereturn()
{
	ob_clean();
	$body = @file_get_contents('php://input');
	if (!$body) {
		die();
	}
	$body = $this->_xmldataparse($body);
	ksort($body);
	$user_sign = $this->_params_tourl($body);
	if ($user_sign != $body['sign']) {
		echo "<xml><return_code><![CDATA[FAIL]]></return_code></xml>";
		die();
	}
	$d['appid'] = $body['appid'];
	$d['mch_id'] = $body['mch_id'];
	$d['nonce_str'] = \Org\Util\String::randString(20);
	$d['body'] = '标题';
	$d['product_id'] = $body['product_id'];
	$d['out_trade_no'] = date('YmdHis') . rand(10000, 99999);
	$d['total_fee'] = 100;
	$d['spbill_create_ip'] = get_client_ip();
	$d['notify_url'] = 'wxcodepay.php';
	$d['trade_type'] = 'NATIVE';
	// 获取签名
	$d['sign'] = $this->_getwxsign($d);
	// 拼装数据
	$xml = $this->_toxml($d);
	// 发送请求
	$res = $this->_sendprePaycurl($xml);
	if ($res['return_code'] == 'SUCCESS') {
		if ($rerurn_code['code'] == 200) {
			$t['return_code'] = 'SUCCESS';
			$t['appid'] = $body['appid'];
			$t['mch_id'] = $body['mch_id'];
			$t['nonce_str'] = \Org\Util\String::randString(20);
			$t['prepay_id'] = $res['prepay_id'];
			$t['result_code'] = 'SUCCESS';
			$t['sign'] = $this->_getwxsign($t);
			echo $this->_toxml($t);
		}
	}
	exit();
}


// 微信扫码支付成功的回调
public function wxcodepay()
{
	ob_clean();
	$body = @file_get_contents('php://input');
	if (!$body) {
		die();
	}
	$body = $this->_xmldataparse($body);
	ksort($body);
	$user_sign = $this->_params_tourl($body);
	if ($user_sign != $body['sign']) {
		die();
	}
	// 回调处理
	......
	$t['return_code'] = 'SUCCESS';
	$t['return_msg'] = 'OK';
	echo $this->_toxml($t);
}

// 生成xml数据格式
private function _toxml($values)
{
	$xml = "<xml>";
	foreach ($values as $key => $val) {
		if (is_numeric($val)) {
			$xml .= "<" . $key . ">" . $val . "</" . $key . ">";
		} else {
			$xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
		}
	}
	$xml .= "</xml>";
	return $xml;
}

//xml格式数据解析函数
private function _xmldataparse($data)
{
	$msg = array();
	$msg = (array)simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA);
	return $msg;
}

// 格式化参数格式化成url参数
private function _params_tourl($arr)
{
	$buff = "";
	foreach ($arr as $k => $v) {
		if ($k != "sign" && $v != "" && !is_array($v)) {
			$buff .= $k . "=" . $v . "&";
		}
	}
	$buff = trim($buff, "&");
	$buff .= '&key=' . $this->wxkey;
	$sign = strtoupper(md5($buff));
	return $sign;
}

// 生成微信签名
private function _getwxsign($data)
{
	ksort($data);
	$str = '';
	foreach ($data as $key => $value) {
		$str .= !$str ? $key . '=' . $value : '&' . $key . '=' . $value;
	}
	$str .= '&key=' . $this->wxkey;
	$sign = strtoupper(md5($str));
	return $sign;
}





相关文章

我有话说

站长昵称:(*)

输入内容:

选个头像:

评论列表

    ...

    高蒙

    男, PHP程序猿

    文章

    484

    标签

    41

    热度

    10w+

    南京, 江苏, 中国

    人生要是没有理想, 那跟咸鱼有什么分别。