小程序调用支付(一)

//微信支付生成预支付订单
    public function weChat(){
        $id=input('id');
        $request=db("uniform_order")->where('id',$id)->find();
        $nonce_str = $this->rand(32); // uuid 生成随机不重复字符串
        $data['appid']            = "wx56ad8ccec5807919"; //appid
        $data['mch_id']           = "1588554801"; //商户ID
        $data['nonce_str']        = $nonce_str; //随机字符串 这个随便一个字符串算法就可以,我是使用的UUID
        $data['out_trade_no']     = $request['ordersn'];    //商户订单号,不能重复
        $data['body']             = $request['season'];
        $data['openid']           = $request['openid'];
        $data['total_fee']        = $request['amount']*100; //金额
        $data['spbill_create_ip'] = "122.114.169.27";   //ip地址
        $data['notify_url']       = "https://xuexiao.aiwan520.cn/index/index/wx_notify";   //回调地址,用户接收支付后的通知,必须为能直接访问的网址,不能跟参数
        $data['trade_type']       = 'JSAPI';      //支付方式
        //将参与签名的数据保存到数组  注意:以上几个参数是追加到$data中的,$data中应该同时包含开发文档中要求必填的剔除sign以外的所有数据
        $data['sign'] = $this->getSign($data);        //获取签名
        $xml = $this->ToXml($data);            //数组转xml
        //curl 传递给微信方
        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
        $data = $this->curl($url,$xml,[]); // 请求微信生成预支付订单
        //返回结果
        if($data){
            //返回成功,将xml数据转换为数组.
            $re = $this->FromXml($data);
            if($re['return_code'] != 'SUCCESS'){
                $msg = isset($re['return_msg'])?$re['return_msg']:'签名失败';
                return ['status'=>false,'msg'=>$msg];
            }
            else{
                //接收微信返回的数据,传给APP!
                $arr =array(
                    'appId'     => "wx56ad8ccec5807919",
                    'signType'  =>'MD5',
                    'package'   => 'prepay_id='.$re['prepay_id'],
                    'nonceStr'  => $nonce_str,
                    'timeStamp' =>time(),
                );
                //第二次生成签名
                $sign = $this->getSign($arr);
                $arr['sign'] = $sign;
                return json_encode(['status'=>true,'msg'=>'生成预支付订单成功','data'=>$arr]);
            }
        } else {
            return ['status'=>false,'msg'=>'签名数据为空'];
        }
    }
    //生成签名
    public function getSign($params) {
        ksort($params);        //将参数数组按照参数名ASCII码从小到大排序
        foreach ($params as $key => $item) {
            if (!empty($item)) {         //剔除参数值为空的参数
                $newArr[] = $key.'='.$item;     // 整合新的参数数组
            }
        }
        $stringA = implode("&", $newArr);         //使用 & 符号连接参数
        $stringSignTemp = $stringA."&key="."1588554801woaixiaofu520520520520";        //拼接key
        // key是在商户平台API安全里自己设置的
        $stringSignTemp = MD5($stringSignTemp);       //将字符串进行MD5加密
        $sign = strtoupper($stringSignTemp);      //将所有字符转换为大写
        return $sign;
    }
    //数组转XML
    public function ToXml($data=array())
    {
        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;
    }
    //XML转数组
    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;
    }
   

2020-05-04 17:29:58 782人阅读 评论( 0 )