php中的微信小程序下单支付

Katen Doe

他的问题描述

php中的微信小程序下单支付遇到一个瓶颈按照微信小程序统一下单接口总是报错,签名总是失败,有没有详细解答我这个问题的?

根据微信小程序的API 参考接口进行对接,废话不多说直接上代码


public function payWx($appid,$mch_id,$openid,$money,$body){
	   $key = 'XXXXXX'; //$key是在微信公众平台中获取的
	   $pay['appid'] = $appid; //$appid是在微信公众平台中获取的
	   $pay['body'] = $body;    //$body商品信息提示
	   $pay['mch_id'] = $mch_id; //$mch_id商户号
	   $pay['nonce_str'] = $this->RandStr(32); //随机字符串
	   $pay['notify_url'] = ' //返回的 
	   $pay['openid'] = $openid;
	   $pay['out_trade_no'] = 'xxxx'.time().rand(10,9999);//订单号
	   $pay['spblill_create_ip'] = $_SERVER['SERVER_ADDR'];
	   $pay['total_fee'] = $money;
	   $pay['trade_type'] = 'JSAPI';
	   $stringA="appid=".$pay['appid']."&body=".$pay['body']."&mch_id=".$pay['mch_id']."&nonce_str=".$pay['nonce_str']."&notify_url=".$pay['notify_url']."&openid=".$pay['openid']."&out_trade_no=".$pay['out_trade_no']."&spblill_create_ip=".$pay['spblill_create_ip']."&total_fee=".$pay['total_fee']."&trade_type=".$pay['trade_type'];
	   $stringB=$stringA."&key=".$key;
	   $sign = strtoupper(md5($stringB));
	   $pay['sign'] = $sign;
		$url ='https://api.mch.weixin.qq.com/pay/unifiedorder';
		$data =$this->arrayToXml($pay);
		$res=$this->postXmlCurl($data, $url,60);
		$pays=$this->xmlToArray($res);
		
		$tete['timeStamp'] = strval(time());
		$tete['nonceStr'] = $this->RandStr(32);
		$tete['package'] = "prepay_id=".$pays['prepay_id'];
		$stringC='appId='.$appid.'&nonceStr='.$tete['nonceStr'].'&package=prepay_id='.$pays['prepay_id'].'&signType=MD5&timeStamp='.time().'&key='.$key;
	    $paySign=strtoupper(md5($stringC));
	   	$tete['paySign'] = $paySign;
	   	$tete['msgid'] = 1;
		return $tete;
   }
   
   //随机字符串
 public function RandStr($length){
	
			$str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
			$len = strlen($str)-1;
			$randstr = '';
			for ($i=0;$i<$length;$i++) {
		  $num=mt_rand(0,$len);
		  $randstr .= $str[$num];
			}
		 return $randstr;
				
	}

   //数组转换成xml
    private function arrayToXml($arr) {
        $xml = "<xml>";
        foreach ($arr as $key => $val) {
            if (is_array($val)) {
                $xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">";
            } else {
                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
            }
        }
        $xml .= "</xml>";
        return $xml;
    }
    
    
    private static function postXmlCurl($xml, $url, $second = 30) 
    {
        $ch = curl_init();
        //设置超时
        curl_setopt($ch, CURLOPT_TIMEOUT, $second);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //严格校验
        //设置header
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        //要求结果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        //post提交方式
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
        curl_setopt($ch, CURLOPT_TIMEOUT, 40);
        set_time_limit(0);
        //运行curl
        $data = curl_exec($ch);
        //返回结果
        if ($data) {
            curl_close($ch);
            return $data;
        } else {
            $error = curl_errno($ch);
            curl_close($ch);
            throw new WxPayException("curl出错,错误码:$error");
        }
    }
 
   
     //xml转换成数组
    private function xmlToArray($xml) {
        //禁止引用外部xml实体 
        libxml_disable_entity_loader(true);
        $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
        $val = json_decode(json_encode($xmlstring), true);
        return $val;
    }


大体方法以上内容亲测 我只写了方法 没有把整个类都写出来 以上是在PHP中小程序下单支付方法

...
A caption for the above image.

解决回答 (3)

wave
  • John Doe

    John Doe

    Jan 08, 2021 14:41 pm

    根据微信小程序的API 参考接口进行对接,废话不多说直接上代码


    public function payWx($appid,$mch_id,$openid,$money,$body){
    	   $key = 'XXXXXX'; //$key是在微信公众平台中获取的
    	   $pay['appid'] = $appid; //$appid是在微信公众平台中获取的
    	   $pay['body'] = $body;    //$body商品信息提示
    	   $pay['mch_id'] = $mch_id; //$mch_id商户号
    	   $pay['nonce_str'] = $this->RandStr(32); //随机字符串
    	   $pay['notify_url'] = ' //返回的 
    	   $pay['openid'] = $openid;
    	   $pay['out_trade_no'] = 'xxxx'.time().rand(10,9999);//订单号
    	   $pay['spblill_create_ip'] = $_SERVER['SERVER_ADDR'];
    	   $pay['total_fee'] = $money;
    	   $pay['trade_type'] = 'JSAPI';
    	   $stringA="appid=".$pay['appid']."&body=".$pay['body']."&mch_id=".$pay['mch_id']."&nonce_str=".$pay['nonce_str']."&notify_url=".$pay['notify_url']."&openid=".$pay['openid']."&out_trade_no=".$pay['out_trade_no']."&spblill_create_ip=".$pay['spblill_create_ip']."&total_fee=".$pay['total_fee']."&trade_type=".$pay['trade_type'];
    	   $stringB=$stringA."&key=".$key;
    	   $sign = strtoupper(md5($stringB));
    	   $pay['sign'] = $sign;
    		$url ='https://api.mch.weixin.qq.com/pay/unifiedorder';
    		$data =$this->arrayToXml($pay);
    		$res=$this->postXmlCurl($data, $url,60);
    		$pays=$this->xmlToArray($res);
    		
    		$tete['timeStamp'] = strval(time());
    		$tete['nonceStr'] = $this->RandStr(32);
    		$tete['package'] = "prepay_id=".$pays['prepay_id'];
    		$stringC='appId='.$appid.'&nonceStr='.$tete['nonceStr'].'&package=prepay_id='.$pays['prepay_id'].'&signType=MD5&timeStamp='.time().'&key='.$key;
    	    $paySign=strtoupper(md5($stringC));
    	   	$tete['paySign'] = $paySign;
    	   	$tete['msgid'] = 1;
    		return $tete;
       }
       
       //随机字符串
     public function RandStr($length){
    	
    			$str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    			$len = strlen($str)-1;
    			$randstr = '';
    			for ($i=0;$i<$length;$i++) {
    		  $num=mt_rand(0,$len);
    		  $randstr .= $str[$num];
    			}
    		 return $randstr;
    				
    	}
    
       //数组转换成xml
        private function arrayToXml($arr) {
            $xml = "<xml>";
            foreach ($arr as $key => $val) {
                if (is_array($val)) {
                    $xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">";
                } else {
                    $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
                }
            }
            $xml .= "</xml>";
            return $xml;
        }
        
        
        private static function postXmlCurl($xml, $url, $second = 30) 
        {
            $ch = curl_init();
            //设置超时
            curl_setopt($ch, CURLOPT_TIMEOUT, $second);
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //严格校验
            //设置header
            curl_setopt($ch, CURLOPT_HEADER, FALSE);
            //要求结果为字符串且输出到屏幕上
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            //post提交方式
            curl_setopt($ch, CURLOPT_POST, TRUE);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
            curl_setopt($ch, CURLOPT_TIMEOUT, 40);
            set_time_limit(0);
            //运行curl
            $data = curl_exec($ch);
            //返回结果
            if ($data) {
                curl_close($ch);
                return $data;
            } else {
                $error = curl_errno($ch);
                curl_close($ch);
                throw new WxPayException("curl出错,错误码:$error");
            }
        }
     
       
         //xml转换成数组
        private function xmlToArray($xml) {
            //禁止引用外部xml实体 
            libxml_disable_entity_loader(true);
            $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
            $val = json_decode(json_encode($xmlstring), true);
            return $val;
        }


    大体方法以上内容亲测 我只写了方法 没有把整个类都写出来 以上是在PHP中小程序下单支付方法

    给他点赞
我来回答TA

 

Press ESC to close