首页> 技术问答 > >php中的微信小程序下单支付

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中小程序下单支付方法