项目背景
不是什么大项目,运用微信效劳商来治理多个子商户,并运用效劳商的接口替子商户下单,效劳商背景才接收到回调
运用场景是web扫码付出
预备
域名应当要在效劳商所归属的民众号内“网页受权域名”设置好(不知此操纵是不是须要?)
在付出效劳商背景设置好回调地点(子商户应当是不必设置)
项目运用apache+php为背景效劳,下载官方付出php demo(native)
我们直接先依据demo的目次构造来玩,直接把解压的example和lib,2个目次都到效劳器根目次
在example目次下,建立cert目次,进效劳商背景-账户中间-api平安,下载证书,放到这个目次内
在example目次下,建立logs目次,用于微信付出log类写日记文件
因为微信付出相干都要运用https,所以检察接见日记在apache目次下的logs目次,ssl_request.txt文件,最下面,能够看到回调地点是不是被要求
注重
官方demo有2个体式格局的扫码付出,第一种体式格局已不供应,都运用第二种
官方的demo,会有不能显现二维码的bug,例子页面是native.php
打印print_r($result); 这个,会显现毛病,主假如关于于curl的毛病,自行百度处置惩罚
设置
在WxPay.Config.Interface.php中的接口对象中增添一个大众要领public abstract function GetSubMchId(); //猎取子商户id在WxPay.Config.php内里,设置须要的参数,自行百度,而且增添一个要领public function GetSubMchId(){ return '8888888888'; //返回子商户号 by vbyzc }在lib/WxPay.Api.php 内,在一致下单要领unifiedOrder中,下面的参数那段位置,增添$inputObj->SetSub_mch_id($config->GetSubMchId());//子商户号 by vbyzc在各个须要查询定单的的处所回调,付款页面及时检测定单付出状况的要求页面,都要运用此要领来设置子商户id:
$input->SetSub_mch_id($config->GetSubMchId());注重,有的处所能够没有$config对象,请引入WxPay.Config.php ,并初始化:$config = new WxPayConfig();
部份代码
扫码页面:native.php
<?php /** * * example目次下为简朴的付出样例,仅能用于搭建疾速体验微信付出运用 * 样例的作用仅限于指点怎样运用sdk,在平安上面仅做了简朴处置惩罚, 复制运用样例代码时请郑重 * 请勿直接直接运用样例对外供应效劳 * **/ require_once "../lib/WxPay.Api.php"; require_once "WxPay.NativePay.php"; require_once 'log.php'; //初始化日记 $logHandler= new CLogFileHandler("logs/".date('Y-m-d').'.log'); $log = Log::Init($logHandler, 15); //形式一 //官方不再供应形式一付出体式格局 $notify = new NativePay(); //形式二 /** * 流程: * 1、挪用一致下单,获得code_url,生成二维码 * 2、用户扫描二维码,举行付出 * 3、付出完成以后,微信效劳器会关照付出胜利 * 4、在付出胜利关照中须要查单确认是不是真正付出胜利(见:notify.php) */ $out_trade_no = "vbyzc_for_jstx".date("YmdHis"); $input = new WxPayUnifiedOrder(); $input->SetBody("test_body"); $input->SetAttach("test_Attach");//胜利付出的回调里会返回这个 $input->SetOut_trade_no($out_trade_no);//自定义定单号 $input->SetTotal_fee("1"); // 金额 $input->SetTime_start(date("YmdHis")); // $input->SetTime_expire(date("YmdHis", time() + 500)); $input->SetGoods_tag("test_goodsTag"); $input->SetNotify_url("https://service.ktfqs.com/example/wx_pay_callback.php"); $input->SetTrade_type("NATIVE"); $input->SetProduct_id("123456789"); //此id为二维码中包括的商品ID,商户自行定义。 $result = $notify->GetPayUrl($input); $url2 = $result["code_url"]; echo "<div>这是返回:$url2</div>"; print_r($result); ?> <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="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script> </head> <body> <div style="margin-left: 10px;color:#556B2F;font-size:30px;font-weight: bolder;">扫描付出形式二</div><br/> <div> 定单编号<input id="out_trade_no" type="hidden" value="<?php echo $out_trade_no;?>"> </div> <img alt="形式二扫码付出" src="qrcode.php?data=<?php echo urlencode($url2);?>" style="width:150px;height:150px;"/> <div>付出提醒:<span id="query_result" style="color: red">WAITING...</span></div> <script> var t1; var sum=0; $(document).ready(function () { t1=setInterval("ajaxstatus()", 4000); }); function ajaxstatus() { sum++; if(sum>100){ window.clearInterval(t1);return false;} if ($("#out_trade_no").val() != 0) { $.post("orderqueryajax.php", { out_trade_no:$("#out_trade_no").val() }, function (data) { data = $.trim(data); $("#query_result").html(data); if (data=="SUCCESS") { $("#query_result").html("哈哈哈!!付出胜利,行将跳转..."); window.clearInterval(t1) <?php // 插进去php代码 /* if (isset($_POST['history_go']) && $_POST['history_go'] == 3){ echo 'window.setTimeout("history.go(-3);",2000);'; }else{ echo 'window.setTimeout("history.go(-2);",2000);'; } */ ?> } }); } } </script> </body> </html>
查询并返回定单状况页面:orderqueryajax.php
<?php /** * * ajax异步查询定单是不是完成 * **/ require_once "../lib/WxPay.Api.php"; require_once 'log.php'; require_once "WxPay.Config.php"; //初始化日记 $logHandler= new CLogFileHandler("../logs/".date('Y-m-d').'.log'); $log = Log::Init($logHandler, 15); $v = $_POST["out_trade_no"]; if(isset($v) && $v != ""){ $out_trade_no = $v; $config = new WxPayConfig(); $input = new WxPayOrderQuery(); $input->SetOut_trade_no($out_trade_no); $input->SetSub_mch_id($config->GetSubMchId());//子商户号 by vbyzc $result = WxPayApi::orderQuery($config, $input); if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){//返回查询效果 echo $result['trade_state']; }else{ echo "FAIL"; } } ?>
回调页:notify.php
<?php date_default_timezone_set('PRC'); /** * * example目次下为简朴的付出样例,仅能用于搭建疾速体验微信付出运用 * 样例的作用仅限于指点怎样运用sdk,在平安上面仅做了简朴处置惩罚, 复制运用样例代码时请郑重 * 请勿直接直接运用样例对外供应效劳 * **/ // 链接数据库 include_once('../include/conn_db.php'); include_once('../include/db_class.php'); mysql_connect(HOST,NAME,PASS) or die(mysql_error()); mysql_select_db(DBNAME); mysql_query('SET NAMES '.CODEPAGE); require_once "../lib/WxPay.Api.php"; require_once '../lib/WxPay.Notify.php'; require_once "WxPay.Config.php"; require_once 'log.php'; //初始化日记 $logHandler= new CLogFileHandler("logs/".date('Y-m-d').'.log'); $log = Log::Init($logHandler, 15); class PayNotifyCallBack extends WxPayNotify { //查询定单 public function Queryorder($transaction_id) { $input = new WxPayOrderQuery(); $config = new WxPayConfig(); $input->SetTransaction_id($transaction_id); $input->SetSub_mch_id($config->GetSubMchId()); //设置子商户号 by vbyzc $result = WxPayApi::orderQuery($config, $input); Log::DEBUG("query:" . json_encode($result)); if(array_key_exists("return_code", $result) && array_key_exists("result_code", $result) && $result["return_code"] == "SUCCESS" && $result["result_code"] == "SUCCESS") { return true; } return false; } /** * * 回包前的回调要领 * 营业能够继承该要领,打印日记轻易定位 * @param string $xmlData 返回的xml参数 * **/ public function LogAfterProcess($xmlData) { Log::DEBUG("call back, return xml:" . $xmlData); return; } //重写回调处置惩罚函数 /** * @param WxPayNotifyResults $data 回调整释出的参数 * @param WxPayConfigInterface $config * @param string $msg 假如回调处置惩罚失利,能够将毛病信息输出到该要领 * @return true回调出来完成不须要继承回调,false回调处置惩罚未完成须要继承回调 */ public function NotifyProcess($objData, $config, &$msg) { $data = $objData->GetValues(); //TODO 1、举行参数校验 if(!array_key_exists("return_code", $data) ||(array_key_exists("return_code", $data) && $data['return_code'] != "SUCCESS")) { //TODO失利,不是付出胜利的关照 //假如有须要能够做失利时刻的一些清算处置惩罚,而且做一些监控 $msg = "非常非常"; return false; } if(!array_key_exists("transaction_id", $data)){ $msg = "输入参数不正确"; return false; } //TODO 2、举行署名考证 try { $checkResult = $objData->CheckSign($config); if($checkResult == false){ //署名毛病 Log::ERROR("署名毛病..."); return false; } } catch(Exception $e) { Log::ERROR(json_encode($e)); } //TODO 3、处置惩罚营业逻辑 Log::DEBUG("call back JSON:" . json_encode($data)); $notfiyOutput = array(); /* 返回的花样 { "appid": "wxa664cef2fee1b641", //挪用接口提交的民众账号ID "attach": "test",//附加数据,在查询API和付出关照中原样返回,该字段重要用于商户照顾定单的自定义数据 (运用SetAttach设置的) "bank_type": "LQT",//不知什么鬼东西 "cash_fee": "1",// 金额 "fee_type": "CNY",//钱银范例 "is_subscribe": "N",//不知什么鬼东西 "mch_id": "154133502151",// 商户号(效劳商) "nonce_str": "jw0bvddz275qyvxnpdfoaam55h3dw6uk",//微信返回的随机字符串 "openid": "opnVE5pDPx2hWAoLLxyQW5KQt8GA",// 用户openid(应当是关于绑定的公从号) "out_trade_no": "vbyzc_for_jstx20190701010509",// 提议定单时自定义定单号 "result_code": "SUCCESS",// 营业效果 "return_code": "SUCCESS",// 此字段是通讯标识,非生意业务标识,生意业务是不是胜利须要检察result_code来推断 "sign": "80E46C6CC50C25E6B5099AE4E03DA3C6FEFD5B172A99B03A56FAC4A9E11EC8F3",// "sub_mch_id": "154172463171",// 子商户id "time_end": "20190701090530",// 生意业务完毕时候?? "total_fee": "1",// 总金额 "trade_type": "NATIVE",// 付出体式格局 "transaction_id": "4200000301201907011310094985" // 微信付出单号 } */ //查询定单,推断定单真实性 if(!$this->Queryorder($data["transaction_id"])){ $msg = "定单查询失利"; Log::DEBUG("vbyzc run to here : order querySelect faild!!!!!" ); return false; } // 依据微信官方原代码的营业流程,应当是以下: // 支会胜利后微信会不停要求回调,在上面的代码 应当是包函了回调回应的代码, // 假如胜利回应,微信付出应当就住手要求回调,才实行下面的代码 Log::DEBUG("vbyzc run to here :<<<<<<<<<<<<<<start to mysql record" ); $openid = $data['openid'];// 微信用户 $trade_no = $data['transaction_id'];// 微信付出单号 $mch_id = $data['mch_id'];// 商户号 $sub_mch_id = $data['sub_mch_id'];// 子商户id $trade_status = $data['result_code'];// 营业效果 $total_amount = $data['total_fee'];// 总金额 $out_trade_no = $data['out_trade_no'];// 商户自定义定单号 $cmd = "insert into myorder(openid,trade_no,mch_id,sub_mch_id,trade_status,total_amount,out_trade_no,datetime) values ('$openid','$trade_no','$mch_id','$sub_mch_id','$trade_status',$total_amount,'$out_trade_no',NOW())"; mysql_query($cmd); Log::DEBUG("vbyzc run to here :end to mysql record>>>>>>>>>>" ); return true; } } $config = new WxPayConfig(); Log::DEBUG("begin notify"); $notify = new PayNotifyCallBack(); $notify->Handle($config, false); ?>
更多PHP相干技术文章,请接见PHP教程栏目举行进修!
以上就是PHP:微信付出效劳商开辟相干的那点事的细致内容,更多请关注ki4网别的相干文章!