PHP:微信支付服务商开发相关的那点事-php教程

资源魔 27 0

名目布景

没有是甚么年夜名目,应用微服气务商来治理多个子商户,并应用效劳商的接口替子商户下单,效劳商后盾能力接纳到回调

应用场景是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的谬误,自行baidu处理

设置装备摆设

正在WxPay.Config.Interface.php中的接口工具中添加一个公共办法public abstract function GetSubMchId(); //猎取子商户id正在WxPay.Config.php内里,设置装备摆设需求的参数,自行baidu,而且添加一个办法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();

//模式二
/**
 * 流程:
 * 一、挪用对立下单,获得code_url,天生二维码
 * 二、用户扫描二维码,进行领取
 * 三、领取实现之后,微服气务器会告诉领取胜利
 * 四、正在领取胜利告诉中需求查单确认能否真正领取胜利(见: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 一、进行参数校验
        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 二、进行署名验证
        try {
            $checkResult = $objData->CheckSign($config);
            if($checkResult == false){
                //署名谬误
                Log::ERROR("署名谬误...");
                return false;
            }
        } catch(Exception $e) {
            Log::ERROR(json_encode($e));
        }

        //TODO 三、解决营业逻辑
        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:微信领取效劳商开发相干的那点事的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学 微信支付

抱歉,评论功能暂时关闭!