原生PHP接入微信支付完整代码示例

前言:

这是完整的PHP接入微信支付的代码,供未开发过H5微信支付的小白参考,可以根据自己的实际情况进行修改。

效果:

原生PHP写的,可以直接对接微信H5支付

  • 获取必要的信息
  1. 公众号APPID
  2. 微信支付商户号 【上微信商户就有】
  3. APIKEY【账户设置-安全设置-API安全-API密钥-设置API密钥】
  4. 添加H5支付域名【产品中心-H5支付-开发配置-H5支付域名-新增自己的域名】

 

 

  • 代码说明
    1. 三个php代码,需要放在同一文件夹中
    2. dbFun.php  这个是数据库链接文件,进入修改数据库配置

原生PHP接入微信支付完整代码示例_第1张图片

 

                 3.wxPay.php 这是支付页面。请根据注释备注修改信息。

原生PHP接入微信支付完整代码示例_第2张图片

你的域名/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;
    }
}

结尾:

欢迎大家补充、完善这篇文章,为后来者提供更多帮助。感谢!欢迎转载,分享有心,请保留转载地址,谢谢!

 

你可能感兴趣的:(支付,php)