首页 > 编程语言 >微信支付基于PHP

微信支付基于PHP

时间:2023-05-07 18:32:52浏览次数:32  
标签:function 基于 return 微信 appid curl PHP id



//微信JSAPI支付

前端页面wx.html

<html>
<head>
   <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
   <meta name="viewport" content="width=device-width, initial-scale=1"/>
   <title>微信支付样例-支付</title>
   <script src=""></script>

   <script type="text/javascript">
        function onBridgeReady(){
            var order_id = 7;
            $.ajax({
                'type':'get',
                'url':'http://wx.owenzhang.com/Pay',
                'data':{            //默认自动添加callback参数
                    'order_id':order_id,
                   'token':'27_G7oqz8ofmbn6q7aSsmpkGeVbQ'  //不安全,请定期刷新token,建议进行文件压缩
                },
                'dataType':'json',
                'success':function(json){
                    var json = json.data;
                    //微信JSAPI支付
                    WeixinJSBridge.invoke(
                        'getBrandWCPayRequest', {
                            "appId":json.appId,     //公众号id,由商户传入
                            "timeStamp":json.timeStamp, //时间戳,自1970年以来的秒数
                            "nonceStr":json.nonceStr, //随机串
                            "package":json.package,//订单详情扩展字符串
                            "signType":json.signType, //微信签名方式:
                            "paySign":json.paySign //微信签名
                        },
                        function(res){
                            if(res.err_msg == "get_brand_wcpay_request:ok" ){
                                // 使用以上方式判断前端返回,微信团队郑重提示:
                                //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
                                window.location.href = 'http://owenwx.ygkj8.cn/app/index.php?i=1&c=entry&a=wxapp&m=hotel_jm&do=paysucceed&order_id='+order_id;
                            }

                        });
                },
                'error': function(XMLHttpRequest, textStatus, errorThrown) {
                    alert("请求失败:" + XMLHttpRequest.status);
                }
            });
        }
   </script>

</head>
<body>
<br/>
<font color="#9ACD32"><b>该笔订单支付金额为<span style="color:#f00;font-size:50px">1分</span>钱</b></font><br/><br/>
<div align="center">
   <button style="width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer;  color:white;  font-size:16px;" type="button" onclick="onBridgeReady()" >立即支付</button>
</div>
</body>
</html>

接口方法

/**
         * 微信支付
         * @access public
         * @param null
         * @return array 返回类型
         * {
        "errno": 0,
        "message": "",
        "data": {
        "appId": "wx412359e77e1b1",
        "timeStamp": "1572319025",
        "nonceStr": "zg237y9123wlx83opu3muusu03wpt",
        "package": "prepay_id=wx29123ec43a85f1123462900",
        "signType": "MD5",
        "paySign": "78C5D9E6123D1F7F948A152D4"
        }
        }
         */
        public function doPagePay()
        {           
            $good_name = '商品名称';            
            $appid = $res["appid"];//公众号appid
            $openid = $this->openid;//用户微信openid
            $mch_id = $res["mchid"];//公众号支付商户号
            $key = $res["wxkey"];//公众号支付Api密钥
            $out_trade_no = $mch_id . time();//支付商户订单号
            $total_fee = $_GPC["money"];
            $total_fee = 0.01;
            $openid = 'onn6Bwf62aiyafBKQsPc072FIHrw';
            if (empty($total_fee)||!$good_name||!$total_fee) {
                return $this->result(10008, '参数错误', '');
            } else {
                $total_fee = floatval($total_fee * 100);
            }       

            $weixinpay = new WeixinPay($appid, $openid, $mch_id, $key, $out_trade_no, $good_name, $total_fee);
            $return = $weixinpay->pay();
            return $this->result(0, '', $return);
        }


        /**
         * 支付成功回调,微信查询订单
         *
         * @access public
         * @param null
         * @return array 返回类型
         */
        public function doPagePaysucceed(){

            $appid = $res["appid"];//公众号appid
            $openid = $this->openid;//用户微信openid
            $mch_id = $res["mchid"];//公众号支付商户号
            $key = $res["wxkey"];//公众号支付Api密钥

            $weixinpay = new WeixinPay($appid, $openid, $mch_id, $key, $out_trade_no, '', '');
            $orderquery = $weixinpay->wxOrderQuery();

            if ($orderquery['return_code']=='SUCCESS'){
                return $this->result(0, '支付成功', '');
            }else{
                return $this->result(0, '该订单支付失败', '');
            }
        }

微信支付基于PHP_ajax

微信支付基于PHP_js_02

父类wxpay.php

/**
     * 微信支付
     * 微信支付:JSAPI支付,订单查询,
     * @author      owenzhang
     * @version     1.0 
     */
<?php
class WeixinPay
{
    protected $appid;
    protected $mch_id;
    protected $key;
    protected $openid;
    protected $out_trade_no;
    protected $body;
    protected $total_fee;
    function __construct($appid, $openid, $mch_id, $key, $out_trade_no, $body, $total_fee)
    {

        $this->appid = $appid
        $this->openid = $openid;
        $this->mch_id = $mch_id;
        $this->key = $key;
        $this->out_trade_no = $out_trade_no;
        $this->body = $body;
        $this->total_fee = $total_fee;

    }
    //微信JSAPI支付
    public function pay()
    {
        $return = $this->weixinapp();
        return $return;
    }
    //微信支付查询订单
    public function wxOrderQuery()
    {
        $return = $this->orderquery();
        return $return;
    }
    private function unifiedorder()
    {
        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
        $parameters = array("appid" => $this->appid, "mch_id" => $this->mch_id, "nonce_str" => $this->createNoncestr(), "body" => $this->body, "out_trade_no" => $this->out_trade_no, "total_fee" => $this->total_fee, "spbill_create_ip" => "192.168.0.161", "notify_url" => "http://www.weixin.qq.com/wxpay/pay.php", "openid" => $this->openid, "trade_type" => "JSAPI");
        $parameters["sign"] = $this->getSign($parameters);
        $xmlData = $this->arrayToXml($parameters);
        $return = $this->xmlToArray($this->postXmlCurl($xmlData, $url, 60));
        return $return;
    }

    private function orderquery()
    {
        $url = "https://api.mch.weixin.qq.com/pay/orderquery";
        $parameters = array("appid" => $this->appid, "mch_id" => $this->mch_id, "out_trade_no" => $this->out_trade_no, "nonce_str" => $this->createNoncestr(), "sign_type" => "MD5");
        $parameters["sign"] = $this->getSign($parameters);
        $xmlData = $this->arrayToXml($parameters);
        $return = $this->xmlToArray($this->postXmlCurl($xmlData, $url, 60));
        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);
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        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);
        $data = curl_exec($ch);
        if ($data) {
            curl_close($ch);
            return $data;
        } else {
            $error = curl_errno($ch);
            curl_close($ch);
            throw new WxPayException("curl出错,错误码:{$error}");
        }
    }
    private function arrayToXml($arr)
    {
        $xml = "<root>";
        foreach ($arr as $key => $val) {
            if (is_array($val)) {
                $xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">";
            } else {
                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
            }
        }
        $xml .= "</root>";
        return $xml;
    }
    private function xmlToArray($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 weixinapp()
    {
        $unifiedorder = $this->unifiedorder();
        $parameters = array("appId" => $this->appid, "timeStamp" => '' . time() . '', "nonceStr" => $this->createNoncestr(), "package" => "prepay_id=" . $unifiedorder["prepay_id"], "signType" => "MD5");
        $parameters["paySign"] = $this->getSign($parameters);
        return $parameters;
    }
    private function createNoncestr($length = 32)
    {
        $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
        $str = '';
        $i = 0;
        while ($i < $length) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
            $i++;
        }
        return $str;
    }
    private function getSign($Obj)
    {
        foreach ($Obj as $k => $v) {
            $Parameters[$k] = $v;
        }
        ksort($Parameters);
        $String = $this->formatBizQueryParaMap($Parameters, false);
        $String = $String . "&key=" . $this->key;
        $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;
    }
}

Buy me a cup of coffee :)


标签:function,基于,return,微信,appid,curl,PHP,id
From: https://blog.51cto.com/owenzhang24/6252334

相关文章

  • 【web 开发基础】PHP 中数组的定义和使用
    前言在PHP中定义数组非常灵活。与其他许多编程语言中的数组不同,PHP不需要在创建数组时指定数组的大小和类型,甚至无需再使用数组前先行声明,也可以在同一个数组中存储任何类型的数据,PHP支持一维和多维数组,可以由用户创建,也可以由一些特定的数据库处理函数从数据库查询中生成数组,或者......
  • MyCat05——基于Docker搭建MySQL主从复制
    1安装mysql的镜像如果服务器较少,为了充分发挥现有服务器的利用率,可以使用容器化技术来安装mysql。如果服务器没有docker,需要先安装dockeryuminstall-ydockerdocker安装后,启动服务servicedockerstart下载mysql5.7版本的docker镜像dockerpullmysql:5.72启动mysql服务启动......
  • 第10章:10W QPS真刀实操__以及基于ZK+Netty手写分布式测试工具 177手机路人甲账号 主目
    10WQPS真刀实操__以及基于ZK+Netty手写分布式测试工具参考链接系统架构知识图谱(一张价值10w的系统架构知识图谱)https://www.processon.com/view/link/60fb9421637689719d246739秒杀系统的架构https://www.processon.com/view/link/61148c2b1e08536191d8f92f10WQPS真刀实......
  • 微信小程序在wxml里不支持includes,indexOf,findIndex等方法
    小程序的wxml文件内不支持数组的includes,indexOf,findIndex等方法。不是垃圾是什么?玩什么标新立异?不会搞就别TM搞。 开发者:我想上二楼。WX:这里有一坨屎,吃子它,就让你上二楼。开发者:@#$%&@^$*^&*&^$%$^ 咋做?在任意目录创建一个.wxs文件,里面写上如下代码:文件-/utils/wuti......
  • 搭建openldap与phpldapadmin
    现在很多ldap文档不太适合centos7下安装使用ldap,于是自己搓了一篇作为留底LDAP基础概念:在开始部署前,要了解一些LDAP知识点:条目entry区别名/唯一标识名DistinguishedName/DN属性attributeLDAP的条目(entry)是具有区别名(DistinguishedNamed/DN唯一标识名)的属性(attribute)。DN......
  • zabbix基于api方式批量创建监控项和触发器示例
    基于python3zabbixapi方式,达到批量创建指定机器业务端口的监控项和触发器的创建的效果,目前不支持并发处理,只支持串行处理zabbix-net-server.py内容,放到zabbix服务器上,然后执行python3 zabbix-net-server.py启动socket监听#!/usr/bin/python3importsocket,sys,timeimport......
  • 微信公众号对接ChatGPT-实现基于自己知识库的机器人功能-并且可以人工接入进行回复的
    现在很多教程有介绍如何把chatGPT对接到自己的公众号上,利用公众号的自动回复接口功能,实现用户在公众号与chatGPT进行交互。而我实现的功能比上面的要高级很多 首先,用户在公众号端发送咨询消息,可以得到自动回复,并且这个回复是基于我自己的知识库回答的  然后,客服在后台可......
  • 解决微信小程序请"注意游客模式下,调用 wx.login 是受限的, API 的返回是工具的模拟返
    新建一个微信小程序的项目,导入了代码后,出现微信小程序请"注意游客模式下,调用wx.login是受限的,API的返回是工具的模拟返回"这是因为,微信开发者工具没有配置小程序的appid下面添加上就可以了 ......
  • 解决微信小程序"不在以下 request 合法域名列表中"
    如果在本地开发的状态下,我们本机的地址域名是没有配置在小程序后台的我们可以临时禁用掉这个检测看下面图示 ......
  • UNeXt:基于 MLP 的快速医学图像分割网络
    UNeXt是约翰霍普金斯大学在2022年发布的论文。它在早期阶段使用卷积,在潜在空间阶段使用MLP。通过一个标记化的MLP块来标记和投影卷积特征,并使用MLP对表示进行建模。对输入通道进行移位,可以专注于学习局部依赖性。UNeXt完整文章:https://avoid.overfit.cn/post/addeb0eacf6......