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

2 篇文章 0 订阅
1 篇文章 0 订阅

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

 

 

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值