微信h5支付(主要运用web端非微信内部)

微信h5支付首先商户平台要开通h5支付,然后关联公众号,

这里要注意的是h5支付不需要openid,而微信jsapi支付需要openid。
然后拿到:
$appid = ""; //应用 
APPID $mch_id = ""; //微信支付商户号 
$key = ""; //微信商户 API 密钥
注意配置相关域名和授权目录
商户平台


公众平台


public function web_pay(){
    $pr = req::$forms;
    ///查询到的价格
    $sql="select price,id,no from `sm_order` where no='".$pr['oid']."'";
    //echo $sql;die;
    $order = db::queryone($sql);
    //echo '
';print_r($order);die;
    $money= $order['price']*100;                     //充值金额 微信支付单位为分
    $userip = self::__get_client_ip();     //获得用户设备 IP
    //$userip = req::$forms['ip'];
    //echo $userip;die;
    $appid  = "";                  //应用 APPID
    $mch_id = "";                  //微信支付商户号
    $key    = "";                 //微信商户 API 密钥
    $out_trade_no = $order['no'];//平台内部订单号
    $nonce_str = self::__createNoncestr();//随机字符串
    $body = '星座';//内容
    $total_fee = $money; //金额
    $spbill_create_ip = $userip; //IP
    $notify_url = "https://ai.shuaishouhotel.com/v1.0.0/XcxPay/FaceAiPay/notify.php"; //回调地址
    $trade_type = 'MWEB';//交易类型 具体看 API 里面有详细介绍
    $scene_info ='{"h5_info":{"type":"Wap","wap_url":"https://ai.shuaishouhotel.com","wap_name":"支付"}}';//场景信息 必要参数
    $signA ="appid=$appid&attach=$out_trade_no&body=$body&mch_id=$mch_id&nonce_str=$nonce_str¬ify_url=$notify_url&out_trade_no=$out_trade_no&scene_info=$scene_info&spbill_create_ip=$spbill_create_ip&total_fee=$total_fee&trade_type=$trade_type";
    $strSignTmp = $signA."&key=$key"; //拼接字符串  注意顺序微信有个测试网址 顺序按照他的来 直接点下面的校正测试 包括下面 XML  是否正确die('222');
    $sign = strtoupper(MD5($strSignTmp)); // MD5 后转换成大写
    $post_data = "
            $appid
            $mch_id
            $body
            $out_trade_no
            $total_fee
            $spbill_create_ip
            $notify_url
            $trade_type
            $scene_info
            $out_trade_no
            $nonce_str
            $sign
    ";//拼接成 XML 格式
    $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";//微信传参地址
    //echo $post_data;die;
    $dataxml = self::__postXmlCurl($post_data,$url); //后台 POST 微信传参地址  同时取得微信返回的参数
    $objectxml = (array)simplexml_load_string($dataxml, 'SimpleXMLElement', LIBXML_NOCDATA); //将微信返回的 XML 转换成数组
    //echo '
';print_r($objectxml);die;
    if($objectxml['return_code'] == 'SUCCESS'){
        //$sql = 'UPDATE sm_order SET sn = "'.$objectxml['sign'].'" WHERE id='.$order['id'];
        //db::query($sql);
        //$json = '{"Status":200,"Result":{"sn":"'.$objectxml['sign'].'","PrepayId":"'.$objectxml['prepay_id'].'","Package":[],"Url":"'.$objectxml['mweb_url'].'"}}';
    }else{
        //$json = '{"Status":551,"Result":{"ErrorMsg":"'.$objectxml['return_msg'].'"}}';
    }
    header('Location: '.$objectxml['mweb_url']);
    //echo '{"code":1,"orderId":"1320190412181555064378943"}';
}
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 __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
    $data = curl_exec($ch);
    //返回结果
    if($data){
        curl_close($ch);
        return $data;
    }else{
        $error = curl_errno($ch);
        curl_close($ch);
        echo "curl 出错,错误码:$error"."
"; } } private function __get_client_ip() { if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $ip = getenv('HTTP_CLIENT_IP'); } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { $ip = getenv('REMOTE_ADDR'); } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $ip = $_SERVER['REMOTE_ADDR']; } return preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : ''; } //对参数排序,生成MD5加密签名 private function getParam($paramArray, $isencode=false,$k) { $paramStr = ''; ksort($paramArray); $i = 0; foreach ($paramArray as $key => $value) { if ($key == 'Signature'){ continue; } if ($i == 0){ $paramStr .= ''; }else{ $paramStr .= '&'; } $paramStr .= $key . '=' . ($isencode?urlencode($value):$value); ++$i; } $stringSignTemp=$paramStr."&key=".$k; $sign=strtoupper(md5($stringSignTemp)); return $sign; } private function isWeixin() { if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) { return true; } else { return false; } } private function getOpenid($appid, $appsecret) { $SERVER_NAME = $_SERVER['SERVER_NAME']; $REQUEST_URI = $_SERVER['REQUEST_URI']; $redirect_uri = urlencode('https://' . $SERVER_NAME . $REQUEST_URI); $code = $_GET['code']; if (! $code) { // 网页授权当scope=snsapi_userinfo时才会提示是否授权应用 $autourl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=$redirect_uri&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect"; header("location:$autourl"); } else { // 获取openid $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&secret=$appsecret&code=$code&grant_type=authorization_code"; $row = $this->__postXmlCurl($url); return ($row['openid']); } } private function get_code($callback,$xingzuo_url){ $appid = $this->appid; $scope = 'snsapi_userinfo'; $state = md5(uniqid(rand(), TRUE));//唯一ID标识符绝对不会重复 $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $appid . '&redirect_uri=' . urlencode($callback) . '&response_type=code&scope=' . $scope . '&state=' . $state . '#wechat_redirect'; echo $url;die; header("Location:$url"); }

你可能感兴趣的:(记录,备忘)