PHP对接微信支付--Native tp5框架

2023-05-16

这里实现的功能是:网页上点击支付,然后调用此方法生成二维码并且返回二维码的图片路径,然后扫码支付,付款成功进行回调,在回调地址进行数据库操作

 

 

1.配置微信支付参数

//微信支付参数
function weChatPayConfig()
{
    //公众号id
    $config['appid'] = '公众号id';
    //商户号
    $config['mch_id'] = '商户号';
    //key
    $config['key'] = 'key';

    return $config;
}

2.发起微信支付

/**
 * 微信支付-发起订单.
 *
 * @param float  $totalFee   收款总费用 单位元
 * @param string $outTradeNo 唯一的订单号
 * @param string $orderName  订单名称
 * @param string $notifyUrl  支付结果通知url 不要有问号
 * @param string $timestamp  订单发起时间
 *
 * @return array
 */
function weChatPay($totalFee, $outTradeNo, $orderName = '订单名称')
{
    header('Content-type:text/html; Charset=utf-8');

    //获取微信支付参数
    $config = weChatPayConfig();
    $notifyUrl = '回调地址';//支付成功异步回调地址

    //订单发起时间
    $timestamp = time();
    $unified = array(
        'appid' => $config['appid'],
        'attach' => 'pay',             //商家数据包,原样返回,如果填写中文,请注意转换为utf-8
        'body' => $orderName,
        'mch_id' => $config['mch_id'],
        'nonce_str' => createNonceStr(),
        'notify_url' => $notifyUrl,
        'out_trade_no' => $outTradeNo,
        'spbill_create_ip' => get_client_ip(),
        'total_fee' => intval($totalFee * 100),       //单位 转为分
        'trade_type' => 'NATIVE',
    );
    $unified['sign'] = getSign($unified, $config['key']);
    $responseXml = curlPost('https://api.mch.weixin.qq.com/pay/unifiedorder', arrayToXml($unified));
    //禁止引用外部xml实体
    libxml_disable_entity_loader(true);
    $unifiedOrder = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);

    if (false === $unifiedOrder) {
        die('parse xml error');
    }
    if ('SUCCESS' != $unifiedOrder->return_code) {
        die($unifiedOrder->return_msg);
    }
    if ('SUCCESS' != $unifiedOrder->result_code) {
        die($unifiedOrder->err_code);
    }
    $codeUrl = (array) ($unifiedOrder->code_url);
    if (!$codeUrl[0]) {
        exit('get code_url error');
    }

    //生成二维码 这里利用qrcode类库生成的二维码  可根据自己业务进行修改
    return wePayQRCode($codeUrl[0]);

}

3.所用到的一些方法

//获取随机字符串-weChatPay
function createNonceStr($length = 16)
{
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $str = '';
    for ($i = 0; $i < $length; ++$i) {
        $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    }

    return $str;
}


//获取当前服务器时间-weChatPay
function get_client_ip()
{
    if ($_SERVER['REMOTE_ADDR']) {
        $cip = $_SERVER['REMOTE_ADDR'];
    } elseif (getenv('REMOTE_ADDR')) {
        $cip = getenv('REMOTE_ADDR');
    } elseif (getenv('HTTP_CLIENT_IP')) {
        $cip = getenv('HTTP_CLIENT_IP');
    } else {
        $cip = 'unknown';
    }

    return $cip;
}

//获取签名-weChatPay
function getSign($params, $key)
{
    ksort($params, SORT_STRING);
    $unSignParaString = formatQueryParaMap($params, false);
    $signStr = strtoupper(md5($unSignParaString.'&key='.$key));

    return $signStr;
}

//生成签名
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;
}


//发送微信支付请求-weChatPay
function curlPost($url = '', $postData = '', $options = array())
{
    if (is_array($postData)) {
        $postData = http_build_query($postData);
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数
    if (!empty($options)) {
        curl_setopt_array($ch, $options);
    }
    //https请求 不验证证书和host
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    $data = curl_exec($ch);
    curl_close($ch);

    return $data;
}


//发送请求 get方式 一般用post方式 不用此方法
function curlGet($url = '', $options = array())
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    if (!empty($options)) {
        curl_setopt_array($ch, $options);
    }
    //https请求 不验证证书和host
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    $data = curl_exec($ch);
    curl_close($ch);

    return $data;
}

//将数组转为xml-WeChatPay
function arrayToXml($arr)
{
    $xml = '<xml>';
    foreach ($arr as $key => $val) {
        if (is_numeric($val)) {
            $xml .= '<'.$key.'>'.$val.'</'.$key.'>';
        } else {
            $xml .= '<'.$key.'><![CDATA['.$val.']]></'.$key.'>';
        }
    }
    $xml .= '</xml>';

    return $xml;
}

//生成微信支付二维码
function wePayQRCode($url)
{
    include './wechatpay/example/phpqrcode/phpqrcode.php';

    $value = $url;					//二维码内容
    $errorCorrectionLevel = 'L';	//容错级别
    $matrixPointSize = 5;			//生成图片大小

    //生成二维码图片
    $filename = 'qrcode/'.'local'.time().'.png';
    QRcode::png($value, $filename, $errorCorrectionLevel, $matrixPointSize, 2);

    $QR = $filename;				//已经生成的原始二维码图片文件
    $QR = imagecreatefromstring(file_get_contents($QR));

    //输出图片
    imagepng($QR, 'qrcode/'.'qrcode.png');
    imagedestroy($QR);
    return $filename;
}

*****回调地址

    //微信支付回调地址
    public function wePayNotify()
    {
        $params = trim(file_get_contents('php://input'));
        $xml = simplexml_load_string($params);

        if ('SUCCESS' == $xml->return_code) {
            //成功回调异步通知地址
            //订单支付成功
            $orderId = $xml->out_trade_no;

            $data['pay_number'] = $xml->openid;
            $data['trade_num'] = $xml->transaction_id;
            $data['pay_time'] = $xml->time_end;

            /**
            * 在此进行数据库操作
            /

            echo '<xml>
                    <return_code><![CDATA[SUCCESS]]></return_code>
                    <return_msg><![CDATA[OK]]></return_msg>
                  </xml>';
        } else {
            return ajax_return(1002, '异步通知地址回调失败');
        }
    }

一开始先做的支付宝,后来做微信支付 以为也是直接用$_POST就可以接收到支付成功返回的参数。然而是接不到的。微信支付成功后的通知参数是xml格式  必须用


$params = trim(file_get_contents('php://input'));
$xml = simplexml_load_string($params);这种方式   将xml参数转换成对象 然后获取对象中的值。  

业务处理完成一定要记得返回给微信服务器一段xml    


      <xml>
        <return_code><![CDATA[SUCCESS]]></return_code>
        <return_msg><![CDATA[OK]]></return_msg>
      </xml>  

*****此处的回调地址中没有做签名校验     要记得做一步签名校验**********

参考资源 https://www.dedemao.com/wx/demo.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP对接微信支付--Native tp5框架 的相关文章

随机推荐

  • cppcheck代码检查工具安装与使用技巧

    cppcheck代码检查工具安装与使用技巧 Cppcheck 是一种 C C 43 43 代码缺陷静态检查工具 不同于 C C 43 43 编译器及很多其它分析工具 xff0c 它不检查代码中的语法错误 Cppcheck 可以检查非标准代码
  • sed流编辑器中使用变量替换以及执行外部命令

    在使用sed对日志或者其它文本进行parse的过程当中 xff0c 有时候我们需要引用外部变量的值 xff0c 或者获取一个shell命令执行的结果 xff0c 以便达到更加可观的输出结果 这里介绍如何做到 sed 流编辑 1 sed命令及
  • mkisofs命令制作iso文件

    mkisofs命令行格式 mkisofs adDfhJlLNrRTvz print size quiet A lt 应用程序ID gt b lt 开机映像文件 gt c lt 开机文件名称 gt hide lt 目录或文件名 gt hide
  • windows下tree命令列出文件目录树

    windows下tree命令列出文件目录树 tree path f tree D AR C Team f 可以将D AR C Team目录下所有目录及子目录下的文件都打印出来 tree D AR C Team f gt HOMEPATH f
  • yum命令安装历史回滚彻底删除安装的依赖包

    yum命令安装一个软件包是会连同依赖包一起安装 xff0c 但是yum remove卸载时却只卸载这个文件包本身 如果需要删除安装时附加的依赖包可以使用yum history的相关操作实现回滚 假如安装了ecliipse pde xff0c
  • latex在ipython jupyter notebook中的使用

    In 2 from IPython display import Latex In 5 数学公式的前后要加上 或 和 Latex r 34 f x 61 3x 43 7 34 Out 5 In 6
  • MATLAB 2018b 帮助页面设置为中文显示

    MATLAB 2018b 帮助页面设置为中文显示 具体步骤如下 xff1a 1 随机点击一个matlab的函数点击 help 2 点击帮助页面的设置按钮 3 按照如下步骤设置即可
  • 图解Java线程死锁的必要条件

    文章目录 What is Deadlock发生死锁要如何解决如何预防死锁参考资料 What is Deadlock In concurrent computing a deadlock is a state in which each me
  • 远程LINUX桌面的好用工具,NoMachine.

    安装及使用都比VNC及XManager要好用 xff0c 网站 https www nomachine com 对应下各自的版本后 xff0c 按照网站的说明进行安装就可以了 xff0c 安装过程不需要其他依赖项 xff01 Linux安装
  • 竞赛经验|2019年电赛B题四旋翼无人机组巡线机器人

    竞赛经验 xff5c 2019年电赛B题四旋翼无人机组巡线机器人 参赛背景和比赛回忆 xff1a 1 院校背景 xff1a 2 规则与现实 xff1a 3 比赛流程 xff1a 备赛建议1 器件选择 xff1a 2 针对学习 xff1a 写
  • C语言实现http post请求和get请求,post请求可以上传图片和文件

    文章目录 1 http协议简介2 http协议分析2 1 http请求2 1 1 请求行2 1 1 1 请求方法2 1 1 2 URL2 1 1 3 协议版本2 1 1 4 请求行总结 2 1 2 请求头部2 1 3 请求数据 2 2 ht
  • 软件改变世界

    随着科技的不断进步 xff0c 软件及其相关技术的发展已经深刻地改变了人类社会的方方面面 从交通运输 医疗卫生到商业服务 教育培训 xff0c 软件技术的应用已经深入到我们的日常生活中 xff0c 对我们的生活方式和生产方式都带来了深刻的影
  • MATLAB 比较好入门书籍有哪些推荐

    https www zhihu com topic 19559252 hot https www zhihu com question 19904418 作者 xff1a 陈村 链接 xff1a https www zhihu com qu
  • pymavlink使用简单教程

    这里写自定义目录标题 pymavlink主要包含的模块连接样例 设置任务样例 更改飞行参数param样例 飞行模式总结 pymavlink Pymavlink是MAVLink协议的python实现 自身包括一个源代码生成器 xff08 ge
  • Python案例003——句子生成器

    目标 xff1a 通过用户提供的内容 xff0c 随机生成唯一的句子 提示 xff1a 以用户输入的名词 代词 形容词等作为输入 xff0c 然后将所有数据添加到句子中 xff0c 并将其组合返回 输出固定的 内容 43 用户输入的内容 c
  • 嵌入式软件工程师面试题

    1 int a 10 61 1 2 3 4 5 6 7 8 9 0 int p 61 amp a 1 则p 6 等于8 2 整数数组清零 xff1a bzero memset 3 siezof 测试变量所占地址的字节数 4 main cha
  • 国内代码仓库-码云

    相信使用github的同学会经常碰到这样的情况 xff0c 当我们从github上面下载稍微大一点的代码的时候就经常下载失败 xff0c 下载网速是非常的感人 国内从github上下载代码非常慢 xff0c 解决办法就是修改host或者vp
  • php对接支付宝Web支付-tp5.1框架

    具体流程 1 获取支付宝相关配置 2 传相关参数请求支付宝网关 订单金额 订单号等 3 支付宝请求回调地址 4 回调地址做相关业务处理 数据库增删改查之类 5 处理完成以后返回success给支付宝服务器 1 首先获取应用id和商户私钥以及
  • TX2+realsense D435i跑VSLAM--001--内核劝退篇

    想要使用tx2连接深度相机realsense D435i xff0c 没想到下载好官方自带SDK后 xff0c 说tx2的版本不满足需求 需要至少L4T28 2 1 xff0c 为什么偏偏就差这么一点版本 xff0c 然后查了查 xff0c
  • PHP对接微信支付--Native tp5框架

    这里实现的功能是 xff1a 网页上点击支付 xff0c 然后调用此方法生成二维码并且返回二维码的图片路径 xff0c 然后扫码支付 xff0c 付款成功进行回调 xff0c 在回调地址进行数据库操作 1 配置微信支付参数 微信支付参数 f