美文网首页
CI3 小程序支付

CI3 小程序支付

作者: 风度翩翩的程序猿 | 来源:发表于2021-06-24 18:19 被阅读0次
    <?php
    defined('BASEPATH') OR exit('No direct script access allowed');
    
    class Wechatpay extends CI_Controller
    {
        //微信支付
        public function pay()
        {
            header("Access-Control-Allow-Origin: *");
            header("Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE");
            header('Access-Control-Allow-Headers:Origin,Content-Type,Accept,token,X-Requested-With,device');
            $datas = file_get_contents('php://input'); // 接收过来的json数据
            $input = json_decode($datas, true);// 转化为数组
            //参数定义
            $appid = 'wx0edb960656828a98';
            $appsecret = '14bc1eea2904258c9517255f10f2f132';
            $mch_id = '1610399092';
            $notify_url = 'https://mengya.wxfzyc.com/api/Wechatpay/wechatNotify';
    
            //获取openid
            /*if(I("post.userid"))
            {
                $infos=M('weixin_users')->find(I("post.userid"));
                $openid = $infos->openid;
            }*/
            $openid = $input['openid'];
            // 获取订单
            $order = $this->db->get_where('t_order', array('id' => $input['id']))->row_array();
            //支付相关设置
            $fee = 0.01;//举例支付0.01
            $body = 'test';
            $nonce_str = $this->nonce_str();//随机字符串
            $out_trade_no = $order['sn'];//商户订单号
            $spbill_create_ip = '211.149.141.92';//服务器的ip【自己填写】;
            $total_fee = $fee*100;// 微信支付单位是分,所以这里需要*100
            $trade_type = 'JSAPI';//交易类型 默认
    
    
            //这里是按照顺序的 因为下面的签名是按照顺序 排序错误 肯定出错
            $post['appid'] = $appid;
            $post['body'] = $body;
            $post['mch_id'] = $mch_id;
            $post['nonce_str'] = $nonce_str;//随机字符串
            $post['notify_url'] = $notify_url;
            $post['openid'] = $openid;
            $post['out_trade_no'] = $out_trade_no;
            $post['spbill_create_ip'] = $spbill_create_ip;//终端的ip
            $post['total_fee'] = $total_fee;//总金额
            $post['trade_type'] = $trade_type;
    
            $sign = $this->getSign($post);//签名
            $post_xml = '<xml> <appid>'.$appid.'</appid>
          <body>'.$body.'</body>
          <mch_id>'.$mch_id.'</mch_id>
          <nonce_str>'.$nonce_str.'</nonce_str>
          <notify_url>'.$notify_url.'</notify_url>
          <openid>'.$openid.'</openid>
          <out_trade_no>'.$out_trade_no.'</out_trade_no>
          <spbill_create_ip>'.$spbill_create_ip.'</spbill_create_ip>
          <total_fee>'.$total_fee.'</total_fee>
          <trade_type>'.$trade_type.'</trade_type>
          <sign>'.$sign.'</sign></xml> '; 
            //统一接口prepay_id
            
            $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
            $xml = $this->http_request($url, $post_xml);
            $array = $this->xml($xml);//全要大写
            if ($array['return_code'] == 'SUCCESS' && $array['result_code'] == 'SUCCESS') {
           
               
                $time = time();
                $data['appId'] = $appid;
                $data['timeStamp'] = strval($time);//时间戳
                $data['nonceStr'] = $nonce_str;//随机字符串
                $data['signType'] = 'MD5';//签名算法,暂支持 MD5
                $data['package'] = 'prepay_id='.$array['prepay_id'];//统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=*
                $data['paySign'] = $this->getSign($data);//签名,具体签名方案参见微信公众号支付帮助文档;
                  $data['state'] = 200;
                $data['out_trade_no'] = $out_trade_no;
            } else {
                $data['state'] = 0;
                $data['text'] = "错误";
                $data['return_code'] = $array['return_code'];
                $data['result_code'] = $array['result_code'];
            }
            $this->db->insert('t_test',array('data'=>json_encode($data,JSON_UNESCAPED_UNICODE)));
            header('Content-Type:application/json;charset=utf-8');
            echo json_encode($data,JSON_UNESCAPED_UNICODE);
        }
    
    
        //随机32位字符串
        private function nonce_str()
        {
            $result = '';
            $str = 'QWERTYUIOPASDFGHJKLZXVBNMqwertyuioplkjhgfdsamnbvcxz';
            for ($i = 0; $i < 32; $i++) {
    
                $result .= $str[rand(0, 48)];
            }
            return $result;
        }
    
    
         //作用:生成签名
        private function getSign($Obj) {
            $key = "Skyabc007514419Skyabc007514419Sk";
            foreach ($Obj as $k => $v) {
                $Parameters[$k] = $v;
            }
            //签名步骤一:按字典序排序参数
            ksort($Parameters);
            $String = $this->formatBizQueryParaMap($Parameters, false);
            //签名步骤二:在string后加入KEY
            $String = $String . "&key=" . $key;
            //签名步骤三:MD5加密
            $String = md5($String);
            //签名步骤四:所有字符转为大写
            $result_ = strtoupper($String);
            return $result_;
        }
    
        //curl请求
        public function http_request($url, $data = null, $headers = array())
        {
            $curl = curl_init();
            if (count($headers) >= 1) {
                curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
            }
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
            if (!empty($data)) {
                curl_setopt($curl, CURLOPT_POST, 1);
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            }
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($curl);
            curl_close($curl);
            return $output;
        }
        
        
         ///作用:格式化参数,签名过程需要使用
        private function formatBizQueryParaMap($paraMap, $urlencode) {
            $buff = "";
            ksort($paraMap);
            foreach ($paraMap as $k => $v) {
                if ($urlencode) {
                    $v = urlencode($v);
                }
                $buff .= $k . "=" . $v . "&";
            }
            $reqPar;
            if (strlen($buff) > 0) {
                $reqPar = substr($buff, 0, strlen($buff) - 1);
            }
            return $reqPar;
        }
    
    
        //获取xml
        private function xml($xml)
        {
            // $p = xml_parser_create();
            // xml_parse_into_struct($p, $xml, $vals, $index);
            // xml_parser_free($p);
            // $data = "";
            // foreach ($index as $key => $value) {
            //     if ($key == 'xml' || $key == 'XML') continue;
            //     $tag = $vals[$value[0]]['tag'];
            //     $value = $vals[$value[0]]['value'];
            //     $data[$tag] = $value;
            // }
            // return $data;
    
            //禁止引用外部xml实体
            libxml_disable_entity_loader(true);
            $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
            return $values;
        }
    
        public function wechatNotify()
        {
            //存储微信的回调
            $xml = file_get_contents("php://input");
            $arr = $this->XmlToArr($xml);
            $out_trade_no = $arr['out_trade_no'];
            $openid = $arr['openid'];//openid
            $sign = $arr['sign'];//校验码
            $total_fee = $arr['total_fee'];//订单金额
            $transaction_id = $arr['transaction_id'];//微信支付号
             // 支付回调更改状态
            $order = $this->db->get_where('t_order', array('sn' => $out_trade_no))->row_array();
            // 用户更改为消费用户
            $this->db->update('t_user', array('shenfen' => 2), array('id' => $order['user_id']));
            // 支付状态改为已经支付 修改支付时间
            $this->db->get_where('t_order',array('status'=>2,'pay_time'=>time()),array('sn'=>$out_trade_no));
    
            echo 'success';
        }
    
    
        private 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
          private function arrayToXml($arr) {
            $xml = "<root>";
            foreach ($arr as $key => $val) {
              if (is_array($val)) {
                $xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">";
              } else {
                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
              }
            }
            $xml .= "</root>";
            return $xml;
          }
    }
    
    
    

    相关文章

      网友评论

          本文标题:CI3 小程序支付

          本文链接:https://www.haomeiwen.com/subject/vprgyltx.html