体育彩票31选7 www.tyv1.com.cn 体育彩票31选7 > 上网技巧 > 电脑小技巧 > php小程序微信支付代码以及目录结构

php小程序微信支付代码以及目录结构

时间:2018-06-17 15:53 作者:QQ地带 我要评论

wxconfig.php
 
<?php  
 
//微信小程序配置  
$config=array(  
    //小程序appid  
    'appid'=>"小程序appid",  
    //小程序key  
    'secret'=>"小程序key",  
    //微信支付商户id  
    'mch_id'=>"111111111111xx",  
    //微信支付商户key  
    'key'=>"fbdedc869060bb606754251ead59f48a111",  
       
);
 
 
 
wxpay.php
 
<?php   
 
/** 小程序微信支付 **/ 
      
class wxpay {  
    protected $appid;   
    protected $mch_id;   
    protected $key;   
    protected $openid;   
    protected $out_trade_no;   
    protected $body;   
    protected $total_fee;  
    protected $notify_url;  
    protected $logfile="log.txt";  
    public $islog=true;  
       
    function __construct($config) {   
        $this->appid = $config["appid"];   
        $this->mch_id = $config["mch_id"];  
        $this->key = $config["key"];  
          
    }  
       
    public function pay($payinfo) {   
        $this->openid = $payinfo["openid"];  
        $this->out_trade_no = $payinfo["out_trade_no"];  
        $this->body = $payinfo["body"];  
                   
   
        $this->total_fee = $payinfo["total_fee"];  
        $this->notify_url = $payinfo["notify_url"];  
          
        //统一下单接口   
        $return = $this->weixinpay();   
        return $return;   
    }   
       
    //微信支付回调数据  
    public function notifydata(){  
        $xml = $GLOBALS['HTTP_RAW_POST_DATA'];  
        return xmlToArray($xml);  
    }  
       
       
    //订单查询  
    public  function orderQuery($transaction_id){  
        $url = 'https://api.mch.weixin.qq.com/pay/orderquery';   
         $parameters=array(   
            'appid' => $this->appid, //小程序ID   
            'mch_id' => $this->mch_id, //商户号   
            'nonce_str' => $this->createNoncestr(), //随机字符串   
            'transaction_id' => $transaction_id //微信订单号  
   
        );  
         $parameters['sign'] = $this->getSign($parameters);  
         $xmlData = $this->arrayToXml($parameters);   
         $return = $this->xmlToArray($this->postXmlCurl($xmlData, $url, 60));   
         return $return;   
    }  
    //统一下单接口   
    private function unifiedorder() {   
        $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';   
        $parameters=array(   
            'appid' => $this->appid, //小程序ID   
            'mch_id' => $this->mch_id, //商户号   
            'nonce_str' => $this->createNoncestr(), //随机字符串   
            'body' => $this->body,  
            // 'out_trade_no' => date("YmdHis"),// 商户订单号   
            'out_trade_no' => $this->out_trade_no,   
            // 'total_fee' => floatval(0.01  100), //总金额 单位 分   
            'total_fee' => $this->total_fee,   
            'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], //终端IP   
            // 'notify_url' => $this->notify_url,// 通知地址  确保外网能正常访问   
            'openid' => $this->openid,// 用户id   
            'trade_type' => 'JSAPI'//交易类型   
        );  
        if(!empty($this->body)){  
             $parameters["body"] = $this->body;  
        }  
          
        if(!empty($this->notify_url)){  
             $parameters["notify_url"] = $this->notify_url;  
        }  
        //统一下单签名   
        $parameters['sign'] = $this->getSign($parameters);   
        $xmlData = $this->arrayToXml($parameters);   
          
        if($this->islog)  
        file_put_contents($this->logfile, "request:\n".$xmlData."\n",FILE_APPEND);  
       
       
        $responsexml  = $this->postXmlCurl($xmlData, $url, 60);  
   
        $return = $this->xmlToArray($responsexml);   
        if($this->islog)  
        file_put_contents($this->logfile, "response:\n".$responsexml."\n",FILE_APPEND);  
        return $return;   
    }  
       
    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 arrayToXml($arr) {   
        $xml ="<xml>";   
        foreach ($arr as $key => $val) {   
            if (is_array($val)) {   
                $xml .="<". $key .">". arrayToXml($val) ."</".$key.">" ;   
            } else {   
                $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";  
            }   
        }   
        $xml .= "</xml>";  
        return $xml;   
    }   
    //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;   
    }   
    //微信小程序接口   
    private function weixinpay() {   
        //统一下单接口   
        $unifiedorder = $this->unifiedorder();  
        $parameters = array(   
            'appId' => $this->appid, //小程序ID   
            'timeStamp' => '' . time() . '',// 时间戳   
            'nonceStr' => $this->createNoncestr(),// 随机串   
            'package' => 'prepay_id=' . $unifiedorder['prepay_id'], //数据包   
            'signType' => 'MD5'//签名方式   
        );   
          
       // 签名   
        $parameters['paySign'] = $this->getSign($parameters);   
        return $parameters;   
    }   
       
    //作用:产生随机字符串,不长于32位   
    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;   
    }  
       
    //作用:生成签名   
    private function getSign($Obj) {   
        foreach ($Obj as $k => $v) {   
            $Parameters[$k] = $v;   
        }   
        // 签名步骤一:按字典序排序参数   
        ksort($Parameters);   
        $String = $this->formatBizQueryParaMap($Parameters, false);   
        //签名步骤二:在string后加入KEY   
        $String = $String ."&key=". $this->key;  
       // 签名步骤三:MD5加密   
        $String = md5($String);   
        //签名步骤四:所有字符转为大写   
        $result_ = strtoupper($String);   
        return $result_;   
    }  
       
    //作用:格式化参数,签名过程需要使用   
    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;   
    }   
}
 
 
 
notify.php
 
<?php   
 
require_once("conf/wxconfig.php");  
require_once("lib/wxpay.php");  
$wxpay = new wxpay($config);  
$result =$wxpay->notifydata();  
//支付成功  
if($result["return_code"]=="SUCCESS"){  
       
    //微信订单号  
    $transaction_id = $result["transaction_id"];  
       
    //查询订单号  
    $query_result = $wxpay->Queryorder($transaction_id);  
       
       
    //订单号存在,并支付成功  
    if(isset($query_result['return_code'])&&$query_result['return_code']=="SUCCESS"&&$query_result['trade_state']=="SUCCESS"){  
          
        //支付金额  
        $total_fee  =intval($result['total_fee']/100);  
          
        //商家订单号  
        $out_trade_no  = $result['out_trade_no'];  
          
          
        //这里处理商家逻辑  
        //***************  
          
          
        $return_result["return_code"]="SUCCESS";//FAIL  
        $return_result["return_msg"]="OK";  
          
        echo $wxpay->arrayToXml($return_result);  
          
          
    }else{  
        //返回参数  
        $return_result["return_code"]="FAIL";//FAIL  
        $return_result["return_msg"]="FAIL";  
          
        echo $wxpay->arrayToXml($return_result);  
    }  
       
       
}  
 
 
pay.php
 
 
<?php  
error_reporting(0);  
//配置信息  
require_once("conf/wxconfig.php");  
   
//微信支付类  
require_once("lib/wxpay.php");  
$_REQUEST = json_decode(file_get_contents("php://input"),true);  
   
$openid = $_REQUEST["openid"];  
   
$body = $_REQUEST["body"];  
   
$rst = array();  
$paymoney = $_REQUEST["paymoney"];  
if($paymoney != abs(doubleval($paymoney))){  
    $rst["code"]=1;  
    $rst["msg"]="金额格式不正确";  
    json_encode($rst,true);  
    die();  
}  
   
$paymoney=sprintf("%.2f",$paymoney);  
   
   
//用户openid  
// $openid="ok2v-0KnDOtea4Yi0b6dnBrPGvjA";  
//支付内容  
// $body="pay";  
   
   
//商家订单号  
$out_trade_no=date("YmdHis").rand(10000,99999);  
   
   
   
//支付金额  
$total_fee=intval($paymoney*100);  
   
$http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' :'//';      
//回调地址  
$notify_url=$http_type.$_SERVER['HTTP_HOST']."/weixin/notify.php";  
   
//支付信息  
$payinfo = array(  
    //用户openid  
    "openid"=>$openid,  
    //商家订单号  
    "out_trade_no"=>$out_trade_no,  
    //支付内容  
    "body"=>$body,  
    //支付金额  
    "total_fee"=>$total_fee,  
    //支付回调地址  
    "notify_url"=>$notify_url,  
   
);  
//创建微信支付对象  
$wxpay = new wxpay($config);  
   
//返回前端支付参数  
echo json_encode($wxpay->pay($payinfo),true);  
 
 
 

标签: php
顶一下
(0)
0%
踩一下
(0)
0%

Google提供的广告

578| 202| 22| 482| 365| 737| 418| 926| 1| 782|