微信h5支付(主要运用web端非微信内部)_yyp5201314的博客-程序员宅基地

技术标签: 记录  微信h5支付  备忘  

微信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 '<pre>';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&notify_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 = "<xml>
            <appid>$appid</appid>
            <mch_id>$mch_id</mch_id>
            <body>$body</body>
            <out_trade_no>$out_trade_no</out_trade_no>
            <total_fee>$total_fee</total_fee>
            <spbill_create_ip>$spbill_create_ip</spbill_create_ip>
            <notify_url>$notify_url</notify_url>
            <trade_type>$trade_type</trade_type>
            <scene_info>$scene_info</scene_info>
            <attach>$out_trade_no</attach>
            <nonce_str>$nonce_str</nonce_str>
            <sign>$sign</sign>
    </xml>";//拼接成 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 '<pre>';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"."<br>";
    }
}
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");
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yyp5201314/article/details/90035497

智能推荐

gitlab相关命令_sudo gitlab-ctl reconfigure是什么命令_竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。的博客-程序员宅基地

服务命令sudo gitlab-ctl reconfigure # 启动服务;sudo vim /etc/gitlab/gitlab.rb # 修改默认的配置文件;gitlab-rake gitlab:check SANITIZE=true --trace # 检查gitlab;sudo gitlab-ctl status # 查看服务状态;sudo gitlab-ctl start # 启动所有 gitlab 组件;sudo gitlab-ctl stop # 停止所有 gitlab 组_sudo gitlab-ctl reconfigure是什么命令

thinkphp中如何使用phpspreadsheet插件_weixin_30867015的博客-程序员宅基地

thinkphp中如何使用phpspreadsheet插件一、总结一句话总结:多百度,百度什么都有1、thinkphp中用composer安装的插件的命名空间是什么?use PhpOffice\PhpSpreadsheet\Spreadsheet;use PhpOffice\PhpSpreadsheet\Writer\Xlsx;2、插件的代码实例哪里找?...

蓝桥杯:承压计算————Python_python蓝桥杯 承压计算_Kinght_123的博客-程序员宅基地

目录题目解题思路CodeAnswer题目X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。每块金属原料的外形、尺寸完全一致,但重量不同。金属材料被严格地堆放成金字塔形。 {7 }, {5 ,8} , {7, 8,8 }, {9, 2, 7, 2}, _python蓝桥杯 承压计算

system lock mysql_System lock_智珠在睿的博客-程序员宅基地

igoodful@glc (my_table) >show slave status\G;*************************** 1. row ***************************Slave_IO_State: Waitingfor master tosend eventMaster_Host:10.10.10.10Master_User: mysqlsyn..._mysql system lock

使用python来调试串口_weixin_34087307的博客-程序员宅基地

串口模块的波特率比较特别,找了几个串口工具都不支持。。。所以,干脆用python自己来写了,其实已经好奇好久了,别人的工具各种不顺手。需要pyserial的支持,兼容各种平台,不需要新编译二进制文件。 先贴一个定时发送的代码:import serialimport timeser = serial.Serial('/dev/ttyUSB0', 250000, tim..._python调用串口

随便推点

系统地址和服务器地址不一致,在打开远程通服务配置程序时检测系统配置时提示配置失败,映射的ip地址与服务器不一致。..._贫民窟的大富翁的博客-程序员宅基地

t3标准版帐套升级为T6报错t3标准版帐套升级为T6报错t3标准版帐套升级为T6报错原因:1、首先要保证你的T3打上补丁2、在T3升级工具中通帐套引入(注:这时已经报了好多错,你不用去管它,实际你已经把帐套引入过了)3、在SQLserver的查询分析器中执行(注:这点很重要)把T3系统管理输出的U6中的那个*U6.sql文件里所有行拷贝出来,粘贴在查询分析器里,选中要升级的数据库,执行4、再把如下..._远程服务器桌面的ip地址和服务器网卡配置的地址不一致

2022SCAU数据结构题库汇总_合并链表 时间限制:1000ms 代码长度限制:10kb 提交次数:3724 通过次数:2077 题_霹雳霹雳轰轰轰的博客-程序员宅基地

时间限制:1000MS 代码长度限制:10KB提交次数:9027 通过次数:2456题型: 编程题 语言: G++;GCC 编写算法,创建初始化容量为LIST_INIT_SIZE的顺序表T,并实现插入、删除、遍历操作。本题目给出部分代码,请补全内容。...................................................................................._合并链表 时间限制:1000ms 代码长度限制:10kb 提交次数:3724 通过次数:2077 题型:

websphere 修改 server 的http服务的端口号_loveany121的博客-程序员宅基地

当我们在was 上建立 APPServer的时候,was 会帮助我们默认指定APPServer的 http服务的端口号和管理控制台的端口号,在建立概要文件的时候我们可以修改was默认分配给我们的端口号,可是如果我们是在后期APPServer 已经建立成功了在http 服务的端口号呢? 只需要修改两个地方: Websphere 修改端口2008-08-13 2

php fpm高并发,PHP-fpm 高并发下挂掉_丁1点儿的博客-程序员宅基地

服务器环境:CentOS7+nginx1.16+php7.0+mysql8.0服务器的网站在高并发时偶尔会挂掉,nginx报502重启php-fpm后恢复正常,经过数次错误被客户投诉后,下定决心要解决这个问题既然是重启php-fpm后恢复正常,那就从php着手。1、找到php的错误日志文件,查看vi/var/log/php-fpm/error.log发现大量warning错误提示建议增加pm.s...

Flyway failed to initialize: none of the following migration scripts locations could be found:终极解决方案_小飞LOVE霞的博客-程序员宅基地

之前在测试搭建flyway,于是出现了标题中的问题。就去看了这位老哥的解决方案,但是没有解决。献上老哥的文章:https://blog.csdn.net/qq_20107237/article/details/107905640,有兴趣的可以看看。来看看我的解决方案:在项目的 pom.xml 文件中添加如下代码: <build> <resources> <resource> <direc_flyway failed to initialize: none of the following migration scripts locatio

GitHub搭建博客配置SSH_github搭建个人博客时ssh类型是_空旷在远方的博客-程序员宅基地

设置SSH keys1.检查是否存在SSH在Git Bash输入以下指令(任意位置点击鼠标右键),检查是否已经存在了SSH keys。ls -al ~/.ssh如果不存在就没有关系,如果存在的话,直接删除.ssh文件夹里面所有文件:2.生成SSH输入以下指令(邮箱就是你注册Github时候的邮箱)后,回车:ssh-keygen -t rsa -C "[email protected]..._github搭建个人博客时ssh类型是

推荐文章

热门文章

相关标签