微信扫码支付模式二-快速实现

2019-01-17  本文已影响0人  表弟_212

开发者编号APPID: 在【微信公众平台】->开发->基本配置中获取
开发者密钥APPSECRET:在【微信公众平台】->开发->基本配置中获取


商户号MCHID: 在【商户平台】->产品中心->开发配置中获取
商户支付密钥KEY:在【商户平台】->账户中心->API安全中获取
证书文件: 在【商户平台】->账户中心->API安全中下载证书


image.png image.png
<?php

class Util
{

    /**
     * PHP发送请求
     * @param string $api       接口地址
     * @param mixed  $postData  POST请求数据
     */
    public static function httpRequest($api, $postData)
    {
        //1.初始化
        $ch = curl_init();
        //2.配置
            //2.1设置请求地址
            curl_setopt($ch, CURLOPT_URL, $api);
            //2.2数据流不直接输出
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            //2.3POST请求
            if ($postData) {
                curl_setopt($ch, CURLOPT_POST, true);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
            }
            //curl注意事项,如果发送的请求是https,必须要禁止服务器端校检SSL证书
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        //3.发送请求
        $data = curl_exec($ch);
        //4.释放资源
        curl_close($ch);
        return $data;
    }

    /**
     * 将XML文档转化为数组
     * @param  string $xml XML文档
     * @return array
     */
    public static function XmlToArr($xml)
    {   
        if ($xml == '') return '';
        libxml_disable_entity_loader(true);
        $arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);     
        return $arr;
    }

    /**
     * 将数组转化为XML文档
     * @param  array  $arr 数组
     * @return string
     */
    public static function ArrToXml($arr)
    {
        if(!is_array($arr) || count($arr) == 0) return '';

        $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; 
    }
}

class Wxpay 
{ 
    const APPID   =想要吗》私聊我 QQ 1152596875   //开发者编号
    const SECRET  =想要吗》私聊我 QQ 1152596875   ;//开发者密钥
    const MCHID   = 想要吗》私聊我 QQ 1152596875  ;                       //商户号
    const KEY =      //支付秘钥
    const NOTIFY_URL =   //支付成功回调的url

    public function getSign($params)
    {
        //0.移除sign
        if (isset($params['sign'])) unset($params['sign']);
        //1.参数名ASCII码从小到大排序(字典序)
        ksort($params);
        //2.组装字符串,键值对形式 &  md5加密 & 转化为大写
        $str = http_build_query($params) . '&key=' . self::KEY;
        $str = strtoupper(md5(urldecode($str)));
        //3.返回签名
        return $str;
    }
  

    public function getUrl($pid, $price = 1)
    {
        $params = [
            'appid'        => self::APPID,
            'mch_id'       => self::MCHID,
            'nonce_str'    => md5(time()),
            'body'         => '扫码支付模式二',
            'out_trade_no' => date('YmdHis'),
            'total_fee'    => $price,
            'spbill_create_ip'=> $_SERVER['SERVER_ADDR'],
            'notify_url'      => self::NOTIFY_URL,
            'trade_type'      => 'NATIVE',
            'product_id'      => $pid
        ];
        $params['sign'] = $this->getSign($params);

        //数组转xml
        $xml = Util::ArrToXml($params);
        //发送数据到统一下单API地址
        $data = Util::httpRequest('https://api.mch.weixin.qq.com/pay/unifiedorder', $xml);
        $arr =  Util::XmlToArr($data);
        //判断结果
        if($arr['result_code'] == 'SUCCESS' && $arr['return_code'] == 'SUCCESS')
        {
            return $arr['code_url'];
        }else{
            return false;
        }
    }

}

//1.引入PHP生成二维码类库
include './phpqrcode/phpqrcode.php';
//2.获取要生成二维码的文本
$url = (new Wxpay)->getUrl(1);
//3.生成二维码
QRcode::png($url);

比较原生,不懂可以在下面评论区留言,看到我会回复
---转载的话记得加上来自来哪!!!!

上一篇下一篇

猜你喜欢

热点阅读