app PHP微信支付

public function index($arr)
    {

//        $order['order_amount'] = '1';//接口中参数支付金额单位为【分】,参数值不能带小数。对账单中的交易金额单位为【元】。
        $rand = $this->get_unique_value();        //调用随机字符串生成方法获取随机字符串
        $data['appid'] =''; // 商户appid
//        $data['attach'] = '123'; //自定义数据
        $data['mch_id'] = '' ; // 商户号
        $data['body'] = $arr['body']; //商品描述
        $data['spbill_create_ip'] = $_SERVER['SERVER_ADDR'];   //ip地址
        $data['total_fee'] = '';                         //总金额,单位为【分】
        $data['out_trade_no'] = $arr['orderid'];    //商户订单号,不能重复
        $data['nonce_str'] = $rand;                   //随机字符串
        $data['notify_url'] = '';   //回调地址,用户接收支付后的通知,必须为能直接访问的网址,不能跟参数
        $data['trade_type'] = 'APP';      //支付方式
        //将参与签名的数据保存到数组  注意:以上几个参数是追加到$data中的,$data中应该同时包含开发文档中要求必填的剔除sign以外的所有数据
        $data['sign'] = $this->getSign($data,'AppSecret');        //获取签名
        $xml = $this->ToXml($data);            //数组转xml
        //curl 传递给微信方
        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
        $ch = curl_init();
        curl_setopt($ch,CURLOPT_URL, $url);
        if(stripos($url,"https://")!==FALSE){
            curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        }    else    {
            curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
            curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
        }
        //设置header
        curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        //要求结果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        //设置超时
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_POST, TRUE);
        //传输文件
        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
        //运行curl
        $data = curl_exec($ch);
        $ssr = array();
        //返回结果
        if($data){
            curl_close($ch);

            //返回成功,将xml数据转换为数组.
            $re = $this->FromXml($data);
            //print_r($re);die;
            if($re['return_code'] != 'SUCCESS'){
                $ssr['code'] = 201;
                $ssr['msg'] = '签名失败';
                return $ssr;
            }
            else{
                //接收微信返回的数据,传给APP!
                $arr =array(
                    'appid' => $re['appid'],
                    'partnerid' => '',// 商户号
                    'prepayid' =>$re['prepay_id'],
                    'package' => 'Sign=WXPay',
                    'noncestr' => $rand,
                    'timestamp' =>time(),

                );
                //第二次生成签名
                $sign = $this->getSign($arr,Config('app.wxpay.AppSecret'));
                $arr['sign'] = $sign;
//                $arr['code'] = 200;
//                $arr['msg'] = '签名成功';
                return $arr;
            }
        } else {
            $error = curl_errno($ch);
            curl_close($ch);
            $ssr['code'] = 201;
            $ssr['msg'] = 'curl出错,错误码:$error';
            return $ssr;

        }

    }

    public function getSign($params,$singkey)
    {
        ksort($params);        //将参数数组按照参数名ASCII码从小到大排序
        foreach ($params as $key => $item) {
            if (!empty($item)) {         //剔除参数值为空的参数
                $newArr[] = $key.'='.$item;     // 整合新的参数数组
            }
        }
        $stringA = implode("&", $newArr);         //使用 & 符号连接参数
        $stringSignTemp = $stringA."&key=".$singkey;        // key是在商户平台API安全里自己设置的
        $stringSignTemp = MD5($stringSignTemp);       //将字符串进行MD5加密
        $sign = strtoupper($stringSignTemp);      //将所有字符转换为大写
        return $sign;
    }

    public function ToXml($data)
    {
//        if(!is_array($data) || count($data) <= 0)
//        {
//            return '数组异常';
//        }
        $xml = "<xml>";
        foreach ($data as $key=>$val)
        {
            if (is_numeric($val)){
                $xml.="<".$key.">".$val."</".$key.">";
            }else{
                $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
            }
        }
        $xml.="</xml>";
        return $xml;
    }
	public function get_unique_value()
    {
        $str = uniqid(mt_rand(), 1);
        $str = sha1($str);
        return md5($str);
    }
    public function FromXml($xml)
    {
        if(!$xml){
            echo "xml数据异常!";
        }
        //将XML转为array
        //禁止引用外部xml实体
        libxml_disable_entity_loader(true);
        $data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        return $data;
    }
    public function wxNotify()
    {
        //接收微信返回的数据数据,返回的xml格式
        $xmlData = file_get_contents('php://input');
        //将xml格式转换为数组
        $data = $this->FromXml($xmlData);
        file_put_contents( dirname(__FILE__).'weixin.txt', var_export($data,true), FILE_APPEND );
        $arr = array();
        //为了防止假数据,验证签名是否和返回的一样。
        //记录一下,返回回来的签名,生成签名的时候,必须剔除sign字段。
        $sign = $data['sign'];
        unset($data['sign']);
        if($sign == $this->getSign($data,Config('app.wxpay.AppSecret')))
        {
            //签名验证成功后,判断返回微信返回的
            if ($data['result_code'] == 'SUCCESS' && $data['return_code']=="SUCCESS")
            {
                //根据返回的订单号做业务逻辑
                
                //处理完成之后,告诉微信成功结果!
                echo '<xml>
						<return_code><![CDATA[SUCCESS]]></return_code>
						<return_msg><![CDATA[OK]]></return_msg>
						</xml>';
                exit();
            }
            else
            {
                $file = fopen('./log.txt', 'a+');
                fwrite($file,"错误信息:".$data['return_msg'].date("Y-m-d H:i:s"),time()."\r\n");
            }
        }
        else
        {
            $file = fopen('./log.txt', 'a+');
            fwrite($file,"错误信息:签名验证失败".date("Y-m-d H:i:s"),time()."\r\n");
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值