mchid//邮件内获得,1)查看商户平台 appid

php微信支付接口开发程序讲解

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未注册错误)

    如

    则要将  加入到商户平台后台url注册中

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

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

图片 1

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

4)引入官方方法文件

图片 2

图片 3

大致目录结构为:

图片 4

必要条件:appid //公众号后台开发者中心获得

2.配置WxPay.Config.php

/**

*  配置账号信息

*/

class WxPayConfig

{

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

//

/**

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

    * 微信公众号信息配置

*

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

*

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

*

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

* 设置地址:

*

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

* 获取地址:

    * @var string

*/

  const APPID = appid;

  const MCHID = mchid;

  const KEY = key;

  const APPSECRET = secret;

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

/**

    * TODO:设置商户证书路径

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

* API证书下载地址:

    * @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;

}

mchid//邮件内获得

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("");

              $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;

}

key//商户后台自己设置

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;

}

    }

appsecret //公众号开发者中心获得两个证书文件,邮件内获得 apiclient_cert.pem apiclient_key.pem注意事项:公众号后台微信支付-》开发配置-》新增测试目录和测试个人微信号。开发者中心-》网页授权获取用户基本信息-》修改成你的测试域名。否则会出现redirect_uri 参数错误——————————后续待完善——————-微信支付就绪页面后台自行了三次操作:

4.常遇错误

1.url未注册

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

2.appid参数异常

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

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

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

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

1.获取openid

5.其他

暂无..待改进

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

图片 5

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

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

//使用jsapi接口 代码如下复制代码 $jsApi = new JsApi_pub(); //=========步骤1:网页授权获取用户openid============ //通过code获得openid if ) { //触发微信返回code码 $url = $jsApi->createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL); //echo $url; Header; }else { //获取code码,以获取openid $code = $_GET['code']; $jsApi->setCode; $openid = $jsApi->getOpenid(); }

刚开始的时候第一步也遇到问题,没法获得openid这个和部分服务器有关,demo内用的是curl获取的方式。奇怪我的服务器curl一直无法获取到。后来改成file_get_contents可以正常获取了。可这并不是解决之道。因为后面还需要用到更多的curl操作。看到开发文档里面有一个地方写证书操作需要libcurl 7.20.1以上版本,然后我就一直在整服务器想把linux的php curl版本提高。最后面我是换到了另外一台windows服务器就好了。先暂时这样吧,下次需要用的时候再调试。

第二步:获取与支付订单号id代码如下

$unifiedOrder = new UnifiedOrder_pub(); //var_dump; //设置统一支付接口参数 //设置必填参数 //appid已填,商户无需重复填写 //mch_id已填,商户无需重复填写 //noncestr已填,商户无需重复填写 //spbill_create_ip已填,商户无需重复填写 //sign已填,商户无需重复填写 $unifiedOrder->setParameter;//商品描述 $unifiedOrder->setParameter;//商品描述 //自定义订单号,此处仅作举例 $timeStamp = time(); $out_trade_no = WxPayConf_pub::APPID."$timeStamp"; $unifiedOrder->setParameter("out_trade_no","$out_trade_no");//商户订单号 $unifiedOrder->setParameter;//总金额 $unifiedOrder->setParameter("notify_url",WxPayConf_pub::NOTIFY_URL);//通知地址 $unifiedOrder->setParameter;//交易类型 //非必填参数,商户可根据实际情况选填 //$unifiedOrder->setParameter;//子商户号 //$unifiedOrder->setParameter;//设备号 //$unifiedOrder->setParameter;//附加数据 //$unifiedOrder->setParameter;//交易起始时间 //$unifiedOrder->setParameter;//交易结束时间 //$unifiedOrder->setParameter;//商品标记 //$unifiedOrder->setParameter;//用户标识 //$unifiedOrder->setParameter;//商品ID $prepay_id = $unifiedOrder->getPrepayId(); //echo 'prepay_id:'; var_dump;

这一步也遇到非常多的问题。首先微信支付测试比较困难,只有在微信内才可以测试。我就用手机刷来刷去。其次使用var_dump调试也不好使额。打印一些 xml格式的文件只显示字符长度,不显示内容。于是用log的形式写在服务器上调试,log代码:代码如下

// 打印log function log_d { $log_name="./logd.log";//log文件路径 $fp = fopen; flock ; fwrite($fp,"执行日期:".strftime("%Y-%m-%d-%H:%M:%S",time; flock; fclose; }

在demo里面的 WxPayPubHelper.php 里面 用 $this->log_d;调用。刚开始的时候由于给我的mchid和 appid不匹配一直报错。。是他们给错我账号了。刚开始我也不懂乱试。这一步的调试在 getPrepayId()内 var_dump; 就能看到错误代码。

本文由美高梅游戏网站登录发布于美高梅棋牌游戏,转载请注明出处:mchid//邮件内获得,1)查看商户平台 appid

您可能还会对下面的文章感兴趣: