美文网首页
php微信支付全记录

php微信支付全记录

作者: XuJiaxin_ | 来源:发表于2018-03-25 22:00 被阅读0次

    1.调用前准备

    1)查看商户平台 appid,key,secret,mchid(商户号);

    获取地址:https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh_CN

    2)在商户平台将前台调用微信支付的页面地址加入商户平台中(否则报url未注册错误)

        如http://www.baidu.com/test/demo.html

        则要将http://www.baidu.com/test/  加入到商户平台后台url注册中

    3)下载商户平台支付证书,在api证书下载中下载

        登录微信支付商户平台,点击【账户中心】->【账户设置】->【API安全】->【下载证书】中,下载及设置;

        除了apiclient_cert.p12,apiclient_cert.pem,apiclient_key.pem,还有rootca.pem要加入证书中

    4)引入官方方法文件

    大致目录结构为:

    2.配置WxPay.Config.php

    /**

    *  配置账号信息

    */

    class WxPayConfig

    {

      //=======【基本信息设置】=====================================

    //

    /**

        * TODO: 修改这里配置为您自己申请的商户信息

        * 微信公众号信息配置

    *

    * APPID:绑定支付的APPID(必须配置,开户邮件中可查看)

    *

    * MCHID:商户号(必须配置,开户邮件中可查看)

    *

    * KEY:商户支付密钥,参考开户邮件设置(必须配置,登录商户平台自行设置)

    * 设置地址:https://pay.weixin.qq.com/index.php/account/api_cert

    *

    * APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置, 登录公众平台,进入开发者中心可设置),

    * 获取地址:https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh_CN

        * @var string

    */

      const APPID = appid;

      const MCHID = mchid;

      const KEY = key;

      const APPSECRET = secret;

      //=======【证书路径设置】=====================================

    /**

        * TODO:设置商户证书路径

        * 证书路径,注意应该填写绝对路径(仅退款、撤销订单时需要,可登录商户平台下载,

    * API证书下载地址:https://pay.weixin.qq.com/index.php/account/api_cert,下载之前需要安装商户操作证书)

        * @var path

    */

      const SSLCERT_PATH = '../cert/apiclient_cert.pem';

      const SSLKEY_PATH = '../cert/apiclient_key.pem';

      //=======【curl代理设置】===================================

    /**

        * TODO:这里设置代理机器,只有需要代理的时候才设置,不需要代理,请设置为0.0.0.0和0

        * 本例程通过curl使用HTTP POST方法,此处可修改代理服务器,

    * 默认CURL_PROXY_HOST=0.0.0.0和CURL_PROXY_PORT=0,此时不开启代理(如有需要才设置)

        * @var unknown_type

    */

      const CURL_PROXY_HOST = "0.0.0.0";//"10.152.18.220";

      const CURL_PROXY_PORT = 0;//8080;

    //=======【上报信息配置】===================================

    /**

        * TODO:接口调用上报等级,默认紧错误上报(注意:上报超时间为【1s】,上报无论成败【永不抛出异常】,

        * 不会影响接口调用流程),开启上报之后,方便微信监控请求调用的质量,建议至少

    * 开启错误上报。

    * 上报等级,0.关闭上报; 1.仅错误出错上报; 2.全量上报

        * @var int

    */

      const REPORT_LEVENL = 1;

    }

    3.示例代码

    //支付方式

    $payData['user_id']=$_SESSION['uid'];//用户id 此处保存在session中,其他自取

    //0余额 1微信公众号 2微信app 3支付宝app

    $payData['type']=1;

    //0:消费 1:充值

    $payData["plus_minus"] = 0;

    $payData["sum"] = (金额);

    $payData["order_type"] = $_REQUEST['order_type'];//支付状态

    $payData["order_id"] = $id;

    $payData["order_num"] = time() . rand(100, 1000);//支付订单号,随机生成

    if ($_REQUEST['order_type'] == 1) {

        $payData["detail"] = "活动报名充值";

    } else if ($_REQUEST['order_type'] == 2) {

        $payData["detail"] = "余额充值";

    }

    //0:未支付 1:已支付

    $payData['status']=0;

    vendor('WeiXinPay.JSAPI');//此处为官方接口文件目录引用方法

    $tools = new JsApiPay();

    //$openid = $tools->GetOpenid();

    $openid = $userinfo["openid"];//获取用户openid 自取

    $Out_trade_no = $payData["order_num"];

    $Body = 'incubator';

    $Total_fee = $_REQUEST['charge']*100; //1=0.01元 所以*100

    //次数order_type 表示支付状态 如果为1 则添加数据库操作

    if($_REQUEST['order_type'] == 1){

    //....将支付数据信息(如活动报名成功信息)加入数据库

    }else{

             $input = new WxPayUnifiedOrder();

                  $input->SetBody($Body);

                  $input->SetAttach("test");

                  $input->SetOut_trade_no($Out_trade_no);

    //        $input->SetOut_trade_no(WxPayConfig::MCHID . date("YmdHis"));

                  $input->SetTotal_fee($Total_fee);

                  $input->SetTime_start(date("YmdHis"));

                  $input->SetTime_expire(date("YmdHis", time() + 600));

    //发送Notify

    $input->SetNotify_url("http://yf.haoapp123.com/fuhuaqi2/api.php/incubator/wechatPayNotify");

                  $input->SetTrade_type("JSAPI");

                  $input->SetOpenid($openid);

                  //        $order = WxPayApi::unifiedOrder($input);

    //动态获取方法

    //  $incubatorInfo = M('regcode')->where("enc_code='".$_REQUEST['bm']."'")->find();

    //            $bm=$_REQUEST['bm'];

     //            $appid=$incubatorInfo['appid'];

     //            $mchid=$incubatorInfo['mchid'];

     //            $order = WxPayApi::unifiedOrder($input,$appid,$mchid);//如要动态获取则需修改 WxPayApi方法使其多加两个参数appid,mchid

    //一般将appid,mchid配置在配置文件中,WxPayApi会自动加载配置文件中的appid和mchid

     $order = WxPayApi::unifiedOrder($input);

    //    dump($order['prepay_id']);

                //获取返回值,输出到前台的data

                  $res = $tools->GetJsApiParameters($order);

                  $result["data"] = json_decode($res);

                  $result["order_num"] = $Out_trade_no;

    // 根据上行取得的支付参数请求支付即可

    //        dump($data);

                  $payData["prepay_id"] = $order['prepay_id'];

                  $payData['create_time'] = date("Y-m-d H:i:s");

                  M('user_balance_pay')->add($payData);//user_balance_pay表为用户信息表储存要保存的信息

                  $result['result'] = '1';

                  $result['result_text'] = 'success';

    //            $result['bm']=$bm;

                  echo json_encode($result);

                  return;

    }

    wechatPayNotify  

    function wechatPayNotify()

    {

            $xml = $GLOBALS['HTTP_RAW_POST_DATA'];

            if (!empty($xml)) {

                $json = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)));

                $order_number = $json->out_trade_no;

                //        $data["prepay_id"] = $order_number;

    //        M('user_balance_pay')->add($data);

                $appPay = M('user_balance_pay')->where('type = 1 and order_num = ' . $order_number)->find();

                if (!empty($appPay)) {

                    $appPay["status"] = 1;

                    $appPay['update_time'] = date("Y-m-d H:i:s");

                    //修改用户支付状态

                    M('user_balance_pay')->save($appPay);

                    if ($appPay["order_type"] == 1) {

                        $this->payResultToGetMeetingroomKey($appPay["order_id"]);

                        $theOrder = M('view_mroom_apply')->where('id=' . $appPay["order_id"])->find();

                        $this->sendMessage($theOrder["openid"],

                            $theOrder["roomnumber"],

                            substr($theOrder["start_time"], 0, 16) . "-" . substr($theOrder["end_time"], 11, 5),

                            $theOrder["enterprise_name"],

                            $theOrder["name"],

                            $theOrder["mobile"]);

    }

    }

                $data["result"] = "1";

                $data["result_text"] = "success";

    //            echo json_encode($data);

                echo "";

                return;

            }else {

                $data["result"] = "0";

                $data["result_text"] = "fail";

    //            echo json_encode($data);

                return;

    }

        }

    4.常遇错误

    1.url未注册

    未将发起微信支付页面加入商户平台url注册中

    2.appid参数异常

    (1)WxPay.Config.php中appid设置错误,或key错误

    (2)虽然微信支付并没有涉及key的操作,但是appid需要key进行解析,所以配置文件中四个参数必须都填上

    (3)证书错误,重新下载

    (4)WxPay.Config.php引用证书路径错误

    5.其他

    暂无..待改进

    1.存储用户支付信息目录(仅作参看)

    2..给公众号用户推送模版消息需要服务器ip加入公众号请求白名单,不知道对微信公众号支付有没有影响,暂议.

                  SDK下载地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1

    相关文章

      网友评论

          本文标题:php微信支付全记录

          本文链接:https://www.haomeiwen.com/subject/mfhkcftx.html