前言:
这是完整的PHP接入微信支付的代码,供未开发过H5微信支付的小白参考,可以根据自己的实际情况进行修改。
效果:
原生PHP写的,可以直接对接微信H5支付
3.wxPay.php 这是支付页面。请根据注释备注修改信息。
你的域名/wxPay.php?money=100&out_trade_no=222
修改对应的money值【金额,单位分】和out_trade_no【订单号】的值
代码:
dbFun.php:
'127.0.0.1',
'DB_NAME' => 'fastadmin', //数据库名
'DB_USER' => 'fastadmin', //用户名
'DB_PWD' => 'qq577785156', //密码
'DB_PORT' => '3306',
);
// 数据库连接
$dbLink = false;
// 连接数据库
function dbConnect()
{
global $dbConfig;
global $dbLink;
$dbLink = mysqli_connect(
$dbConfig['DB_HOST'],
$dbConfig['DB_USER'],
$dbConfig['DB_PWD'],
$dbConfig['DB_NAME']
);
if (!($dbLink)) {
return false;
}
mysqli_set_charset($dbLink, 'utf-8');
return true;
}
// 获取多条记录
function dbSelect($lnk, $sql) {
$res = mysqli_query($lnk, $sql);
if (false === $res) {
return false;
}
$cnt = mysqli_num_rows($res);
if ($cnt == 0) {
mysqli_free_result($res);
return null;
}
$data = array();
while ($row = mysqli_fetch_assoc($res)) {
array_push($data, $row);
}
mysqli_free_result($res);
return $data;
}
// 获取单条记录
function dbFind($lnk, $sql) {
$res = mysqli_query($lnk, $sql);
if (false === $res) {
return false;
}
$cnt = mysqli_num_rows($res);
if ($cnt == 0) {
mysqli_free_result($res);
return null;
}
$data = mysqli_fetch_assoc($res);
mysqli_free_result($res);
return $data;
}
// 执行数据库操作
function dbExecute($lnk, $sql) {
$res = mysqli_query($lnk, $sql);
if (false === $res) {
return false;
}
return true;
}
// 生成订单编号
function generateOrderNo()
{
global $dbLink;
do {
list($usec , $sec) = explode(' ', microtime());
$s = sprintf('%s%03d%03d', date('YmdHis'), intval(floatval($usec) * 1000), rand(1, 999));
$sql = sprintf('select id from t_activity_order where order_no="%s"', $s);
$data = dbFind($dbLink, $sql);
if (empty($data)) {
return $s;
}
} while (true);
}
function payLog($msg)
{
// 日志路径
$path = '/zdrwkj/www/logs/pay-' . date('Y-m-d') . '.log';
// 根据类型记录信息
$s = $msg;
$type = gettype($msg);
if ($type == 'object' || $type == 'array') {
$s = var_export($msg, true);
}
// 写入日志
$fp = fopen($path, "a");
fwrite($fp, date('Y-m-d H:i:s') . "\t");
fwrite($fp, $s);
fwrite($fp, "\r\n");
fclose($fp);
}
?>
wxPay.php
$appid
$mch_id
$body
$out_trade_no
$total_fee
$spbill_create_ip
$notify_url
$trade_type
$scene_info
$out_trade_no
$nonce_str
$sign
";//拼接成XML 格式
$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";//微信传参地址
$dataxml = postXmlCurl($post_data,$url); //后台POST微信传参地址 同时取得微信返回的参数
$objectxml = (array)simplexml_load_string($dataxml, 'SimpleXMLElement', LIBXML_NOCDATA); //将微信返回的XML 转换成数组
function createNoncestr( $length = 32 ){
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str ="";
for ( $i = 0; $i < $length; $i++ ) {
$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
}
function postXmlCurl($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
$data = curl_exec($ch);
//返回结果
if($data){
curl_close($ch);
return $data;
}else{
$error = curl_errno($ch);
curl_close($ch);
echo "curl出错,错误码:$error"."
";
}
}
function get_client_ip($type = 0) {
$type = $type ? 1 : 0;
$ip = 'unknown';
if ($ip !== 'unknown') return $ip[$type];
if($_SERVER['HTTP_X_REAL_IP']){//nginx 代理模式下,获取客户端真实IP
$ip=$_SERVER['HTTP_X_REAL_IP'];
}elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {//客户端的ip
$ip = $_SERVER['HTTP_CLIENT_IP'];
}elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {//浏览当前页面的用户计算机的网关
$arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$pos = array_search('unknown',$arr);
if(false !== $pos) unset($arr[$pos]);
$ip = trim($arr[0]);
}elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];//浏览当前页面的用户计算机的ip地址
}else{
$ip=$_SERVER['REMOTE_ADDR'];
}
// IP地址合法验证
$long = sprintf("%u",ip2long($ip));
$ip = $long ? array($ip, $long) : array('0.0.0.0', 0);
return $ip[$type];
}
?>
微信支付
getNotify.php
notify();
if($result){
if(array_key_exists("return_code", $result)&& array_key_exists("result_code", $result)&& $result["return_code"] == "SUCCESS"&& $result["result_code"] == "SUCCESS"){
//===============================================完成你的逻辑======================================================
//例如连接数据库,获取付款金额$result['total_fee'],获取订单号$result['out_trade_no'],修改数据库中的订单状态等;
$postStr = file_get_contents('php://input');;
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$arr = (array)$postObj;
$arr = json_encode($arr); //这个就是所有信息数组
dbConnect(); //链接数据库
$out_trade_no = $arr['out_trade_no']; //这是订单编号
$total_fee = $arr['total_fee'] ; //这是付款金额,记得单位是分
$sql = sprintf("INSERT INTO fa_wx_wish_b(rich_content) VALUES ('%s') ", $a); //操作数据库的语句
$activityOrder = dbExecute($dbLink, $sql); //进行数据库操作
//===============================================完成你的逻辑======================================================
mysqli_close($dbLink); //关闭数据库
return true;
}
}else{
dbConnect();
$a = json_encode($_POST);
$sql = sprintf("INSERT INTO fa_wx_wish_b(rich_content) VALUES ('%s') ", 'err');
$activityOrder = dbExecute($dbLink, $sql);
mysqli_close($dbLink);
echo 'pay error';
}
class WxpayService_PC2
{
protected $mchid;
protected $appid;
protected $apiKey;
public function __construct($mchid, $appid, $key)
{
$this->mchid = $mchid;
$this->appid = $appid;
$this->apiKey = $key;
}
public function notify()
{
$config = array(
'mch_id' => $this->mchid,
'appid' => $this->appid,
'key' => $this->apiKey,
);
// $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
$postStr = file_get_contents('php://input');;
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
if ($postObj === false) {
die('parse xml error');
}
if ($postObj->return_code != 'SUCCESS') {
die($postObj->return_msg);
}
if ($postObj->result_code != 'SUCCESS') {
die($postObj->err_code);
}
$arr = (array)$postObj;
unset($arr['sign']);
if (self::getSign($arr, $config['key']) == $postObj->sign) {
echo ' ';
return $arr;
}
}
/**
* 获取签名
*/
public static function getSign($params, $key)
{
ksort($params, SORT_STRING);
$unSignParaString = self::formatQueryParaMap($params, false);
$signStr = strtoupper(md5($unSignParaString . "&key=" . $key));
return $signStr;
}
protected static function formatQueryParaMap($paraMap, $urlEncode = false)
{
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v) {
if (null != $v && "null" != $v) {
if ($urlEncode) {
$v = urlencode($v);
}
$buff .= $k . "=" . $v . "&";
}
}
$reqPar = '';
if (strlen($buff) > 0) {
$reqPar = substr($buff, 0, strlen($buff) - 1);
}
return $reqPar;
}
}
结尾:
欢迎大家补充、完善这篇文章,为后来者提供更多帮助。感谢!欢迎转载,分享有心,请保留转载地址,谢谢!