小程序调用API发起微信支付

下面事整体代码就是统一下单,微信小程序调用wxpay()这个方法获取到数据

 下面查询 $orderdetails返回结果

一个价格:totle

一个内部订单号:order_no

内部定义的支付类型(自己想怎么取就怎么取,可要可不要):pay_type_text

再就是config('WX_APP')['wx_appid']这个读取自己配置的appid

/**
     * auth:leishaofa
     * date:2018-12-26
     * parame:微信支付jsapi
    */
    public function wxPay(){
        $orderid = empty(input('orderId')) || !is_numeric(input('orderId'))?self::returnMsg(401, '订单id不存在', []):input('orderId');
        $uid = empty(input('uid'))?self::returnMsg(401, 'UID异常', []): input('uid');
        $storeId = empty(input('storeId'))?self::returnMsg(401, 'STOREID异常', []): input('storeId');
        $openId = empty(input('openId'))?self::returnMsg(401, 'OPENID不存在', []): input('openId');

        $type="JSAPI";
        $key="xxxxxx";//商户支付key
        $mch_id='xxxxxx';//商户号

        $orderModel=new OrderModel();
        $orderdetails=$orderModel->getOrderByID($orderid);
        if(empty($orderdetails)){
            self::returnMsg(401, '订单不存在', []);
        }
        if($orderdetails['uid'] !== (int)$uid){
            self::returnMsg(401, '用户订单列表中不存在该订单', []);
        }
        if($orderdetails['store_id'] !== (int)$storeId){
            self::returnMsg(401, '用户店铺订单不存在', []);
        }
        //调用统一下单接口
        $data=array('appid'=>config('WX_APP')['wx_appid'],
            'mch_id'=>$mch_id,
            'device_info'=>'WX_APP',
            'nonce_str'=> $this->createNoncestr(),
            'sign_type'=>'HMAC-SHA256',
            'body'=>$orderdetails['order_no'].$orderdetails['pay_type_txt'],
            'attach'=>json_encode(array('order_no'=>$orderdetails['order_no'],'pay_type'=>$orderdetails['pay_type_txt']),JSON_UNESCAPED_UNICODE),
            'out_trade_no'=>$orderdetails['order_no'],
            'fee_type'=>'CNY',
            'total_fee'=>intval($orderdetails['total'] * 100),
            'spbill_create_ip'=>$_SERVER['REMOTE_ADDR'],
            'time_start'=>date("YmdHis"),
            'time_expire'=>date("YmdHis", time() + 600),
            'notify_url'=>"https://api.meimamall.com/api/orderPay/pay_callback",
            'trade_type'=>$type,
            'product_id'=>'',
            'limit_pay'=>'no_credit',
            'openid'=>$openId,
            'receipt'=>'',
            'scene_info'=>'',//json_encode(array("store_info"=>array("id"=>"","name"=> "","area_code"=> "编码","address"=>"地址"))),
            );
        $data=array_filter($data);
        ksort($data);
        $sign= trim($this->ToUrlParams($data), "&");
        $sign = $sign.'&key='.$key;
        $sign = hash_hmac("sha256",$sign ,$key);
        $data['sign']=strtoupper($sign);
        $config=array('mch_id'=>$mch_id,'cert'=>'','key'=>'');
        $xml = $this->ToXml($data);
        $response = $this->postXmlCurl($config, $xml, 'https://api.mch.weixin.qq.com/pay/unifiedorder', false, 6);
        if(!$response){
            self::returnMsg(401, 'xml数据异常', []);
        }
        //将XML转为array
        libxml_disable_entity_loader(true);
       $resultarray = json_decode(json_encode(simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        if($resultarray['return_code'] != 'SUCCESS') {
            foreach ($resultarray as $key => $value) {
                #除了return_code和return_msg之外其他的参数存在,则报错
                if($key != "return_code" && $key != "return_msg"){
                    self::returnMsg(401, '输入数据存在异常', []);
                    return false;
                }
            }
            self::returnMsg(401, '失败',$resultarray);
        }

        if(!array_key_exists('sign', $resultarray)){
            self::returnMsg(401, '签名错误',$resultarray);
        }
        self::returnMsg(0, '成功',$resultarray);
    }
    /**
     * auth:leishaofa
     * date:2018-12-26
     * parame:格式化参数格式化成url参数
     */
    public function ToUrlParams($data)
    {
        $buff = "";
        foreach ($data as $k => $v)
        {
            if($k != "sign" && $v != "" && !is_array($v)){
                $buff .= $k . "=" . $v . "&";
            }
        }

        $buff = trim($buff, "&");
        return $buff;
    }

    /*
     * auth:leishaofa
     * date:2018-12-26
     * parame:生成随机字符串
    */
    private function createNoncestr($length = 32) {
        $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }

    /**
     * 将array转为xml
     * @param WxPayConfigInterface $config  配置对象
     * @param string $data array
     * @throws WxPayException
     */
    public function ToXml($data)
    {
        if(!is_array($data) || count($data) <= 0)
        {
            throw new WxPayException("数组数据异常!");
        }

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

    /**
     * 以post方式提交xml到对应的接口url
     * @param WxPayConfigInterface $config  配置对象
     * @param string $xml  需要post的xml数据
     * @param string $url  url
     * @param bool $useCert 是否需要证书,默认不需要
     * @param int $second   url执行超时时间,默认30s
     * @throws WxPayException
     */
    private static function postXmlCurl($config, $xml, $url, $useCert = false, $second = 30)
    {
        $ch = curl_init();
        $curlVersion = curl_version();
        $ua = "WXPaySDK/3.0.9 (".PHP_OS.") PHP/".PHP_VERSION." CURL/".$curlVersion['version']." "
            .$config['mch_id'];

        //设置超时
        curl_setopt($ch, CURLOPT_TIMEOUT, $second);

        $proxyHost = "0.0.0.0";
        $proxyPort = 0;
        //如果有配置代理这里就设置代理
        if($proxyHost != "0.0.0.0" && $proxyPort != 0){
            curl_setopt($ch,CURLOPT_PROXY, $proxyHost);
            curl_setopt($ch,CURLOPT_PROXYPORT, $proxyPort);
        }
        curl_setopt($ch,CURLOPT_URL, $url);
        //证书文件请放入服务器的非web目录下
        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);//严格校验
        }
        curl_setopt($ch,CURLOPT_USERAGENT, $ua);
        //设置header
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        //要求结果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

        if($useCert == true){
            //设置证书
            //使用证书:cert 与 key 分别属于两个.pem文件
            //证书文件请放入服务器的非web目录下
            $sslCertPath = $config['cert'];
            $sslKeyPath = $config['key'];
            curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
            curl_setopt($ch,CURLOPT_SSLCERT, $sslCertPath);
            curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
            curl_setopt($ch,CURLOPT_SSLKEY, $sslKeyPath);
        }
        //post提交方式
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
        //运行curl
        $data = curl_exec($ch);
        //返回结果
        if($data){
            curl_close($ch);
            return $data;
        } else {
            $error = curl_errno($ch);
            curl_close($ch);
           return 'curl出错,错误码:'.$error;
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值