最新版的微信支付全部流程(2017/7/24) php开发的

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29787335/article/details/76824553

前提,每次写文章的话,都会说一堆废话,请各位看官能看得更加的明白,毕竟是之前开发的,很多流程上的细节也许都省了,但是大致的流程是绝对不会有问题的。

要开发微信支付,你就得知道什么是微信支付,微信支付的大概流程就是->看文档->下载案例->做过的(很明白流程的一般就直接把几个有用的拿出来都封装一下),新手的话就

直接像我一样弄到thinkphp的vendor目录,然后用vender引入,vendor和import是一样的,不懂thinkphp的那我就不作过多的解释了,哈哈。像我就是新手菜鸟所以用的就是没有

封装好的方法,新版本和老版本还是有那么一丢丢不一样的,虽然我没开发过老版本,但是我对比过之前的案例,老版本怎么开发的,百度例子很多。还有一句话就是,微信支付

玩的不是代码,逻辑也不复杂,最让人难受的是配置。各个地方配置。(后面会上部分图片代码什么的,例子:可以搜索公众号职易网,我开发的公司的项目,里面的东西价格比较高,所以各位点支付之后叉掉就可以了,哈哈)


流程:看文档->下载案例->将案例引入到项目中->配置(这是我认为最难的地方,/笑哭)->开发

开发的流程和代码我写在这里:

先健一个controller可以叫WxpayController,然后写一个function 名字可以叫subOrder提交订单的意思,你数据库得有个订单表,然后这个订单表,必须要有一个类似于订单号的唯一标识,因为是要将这个东西发送给微信服务器的,这个时候我们可以开始用案例里面的  先获取用户的openid (怎么获得,有很多种办法,比如我这边就是用户绑定的,用户的openid在我的数据库里面) ,然后  掉用      统一下单的方法,        //统一下单(demo里面的,demo在哪下,链接在此https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1)

这下面是解压后example里面的jsapi.php文件里面的代码:

//②、统一下单
$input = new WxPayUnifiedOrder();
$input->SetBody("test");
$input->SetAttach("test");//可自定义的参数
$input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));
$input->SetTotal_fee("1");//价格
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag("test");
$input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");//通知地址也叫回掉地址,后面有大用处的
$input->SetTrade_type("JSAPI");
$input->SetOpenid($openId);//用户的openid
$order = WxPayApi::unifiedOrder($input);
echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>';
printf_info($order);
$jsApiParameters = $tools->GetJsApiParameters($order);


//然后就是显示页面上的效果,什么效果呢,就是当你点击去支付的时候,微信会唤起jsapi支付的那个东西,就是你平时微信支付的时候的那个即将让你输入密码的那个过程

这个地方的代码是我项目中的,根据自己的情况去,有得微信的支付有提交订单,有的没有,后台处理的,逻辑不一样,没法一致,这里主要是看你的需求了,

 $this->assign('jsApiParameters',$jsApiParameters);
 $this->display('pay');



pay.html的页面的代码,同样也是刚才那个jsapi.php里面的代码。这个样式很丑,该咋改或者该怎么弄你们想办法,就行了



<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 type="text/javascript">
//调用微信JS api 支付
function jsApiCall()
{
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
<?php echo $jsApiParameters; ?>,
function(res){
WeixinJSBridge.log(res.err_msg);
alert(res.err_code+res.err_desc+res.err_msg);
}
);
}


function callpay()
{
if (typeof WeixinJSBridge == "undefined"){
   if( document.addEventListener ){
       document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
   }else if (document.attachEvent){
       document.attachEvent('WeixinJSBridgeReady', jsApiCall); 
       document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
   }
}else{
   jsApiCall();
}
}
</script>
<script type="text/javascript">
//获取共享地址
function editAddress()
{
WeixinJSBridge.invoke(
'editAddress',
<?php echo $editAddress; ?>,
function(res){
var value1 = res.proviceFirstStageName;
var value2 = res.addressCitySecondStageName;
var value3 = res.addressCountiesThirdStageName;
var value4 = res.addressDetailInfo;
var tel = res.telNumber;

alert(value1 + value2 + value3 + value4 + ":" + tel);
}
);
}

window.onload = function(){
if (typeof WeixinJSBridge == "undefined"){
   if( document.addEventListener ){
       document.addEventListener('WeixinJSBridgeReady', editAddress, false);
   }else if (document.attachEvent){
       document.attachEvent('WeixinJSBridgeReady', editAddress); 
       document.attachEvent('onWeixinJSBridgeReady', editAddress);
   }
}else{
editAddress();
}
};

</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="callpay()" >立即支付</button>
</div>
</body>
</html>

好了,只要到这里配置没问题,没报错,可以正常支付,那就说明你已经成功了80%了,剩下的就是写回掉,也就是那个前面说很重要的notify这个方法了。其实我看了案例的notify我觉的不是写得不好,是我看着心烦,我就自己写了一份简单的,毫无疑问人家微信的程序员肯定比我666一些,你们可以看看案例里面的notify,我就把我自己的粘上来让你们看看,

    //通知地址
    public function notify(){
        $xml = $GLOBALS['HTTP_RAW_POST_DATA'];

//下面这个xml是用来调试的


//        $xml = "<xml><appid><![CDATA[wx4ad583ab8dd012fc]]></appid>
//                <attach><![CDATA[test]]></attach>
//                <bank_type><![CDATA[CFT]]></bank_type>
//                <cash_fee><![CDATA[1]]></cash_fee>
//                <fee_type><![CDATA[CNY]]></fee_type>
//                <is_subscribe><![CDATA[Y]]></is_subscribe>
//                <mch_id><![CDATA[1244988602]]></mch_id>
//                <nonce_str><![CDATA[6wqfjakb5vbtq3sa8sxlhqco7tw6iath]]></nonce_str>
//                <openid><![CDATA[o-w75jmaRCwcPlsM73lF09jEPtOU]]></openid>
//                <out_trade_no><![CDATA[124498860220170726105824]]></out_trade_no>//
//                <result_code><![CDATA[SUCCESS]]></result_code>
//                <return_code><![CDATA[SUCCESS]]></return_code>
//                <sign><![CDATA[7F60ECFDD8E70F0C34C000510122C29A]]></sign>
//                <time_end><![CDATA[20170726105924]]></time_end>//
//                <total_fee>1</total_fee>//
//                <trade_type><![CDATA[JSAPI]]></trade_type>
//                <transaction_id><![CDATA[4002162001201707262716873443]]></transaction_id>
//                </xml>";
        
        $arr = $this->FromXml($xml);
        //验证签名
        ksort($arr);// 对数据进行排序
        $str = $this->ToUrlParams($arr);//对数据拼接成字符串
        $user_sign = strtoupper(md5($str));
        if($user_sign == $arr['sign']){//验证成功
//修改订单状态啊,

//该干嘛干嘛,事物写了,没进来的也要回滚,不滚都是钱啊。           

//巴拉巴拉一堆~~~~~自己琢磨,都是你们业务上的问题了,

            file_put_contents('xml.txt', $xml);//调试,看这个文件是否有正常的数据
            file_put_contents('url.txt', $url);//调试,看这个文件是否有正常的数据
            file_put_contents('data.txt', json_encode($data));//调试,看这个文件是否有正常的数据
            file_put_contents('result.txt', $result);//调试,看这个文件是否有正常的数据
        }

//

        
    }


流程:看文档->下载案例->将案例引入到项目中->配置(这是我认为最难的地方,/笑哭)->开发代码,也就是写上面的那一堆->写回掉,处理业务逻辑,再仔细的测试有没有问题。


后话,期间你一定会遇到很多的问题,不用担心,前人基本上都踩过你即将要踩的坑,动动小手百度下报错,有时候是你搜索的方式不太正确导致的搜不出来也不好说,哈哈,为什么我不写配置啊,细节啊,因为,毕竟开发这种事还是需要你一点探索摸索的吧,不能你想做一下就把别人代码粘贴过去,啥都弄好了,还是要多遇见问题,发现并解决问题,不然今天写了微信支付,明天出去面试别人问你,回掉咋弄的,统一下单是咋弄的,一问三不知,有时候我们为了目的去做一件事,但是事后你会发现其实过程比结果还重要。

~~~一杯敬代码,一杯敬死亡。


有问题的可以文章下面留言,看到就会及时回复~~~望与君共勉 。      


猜你喜欢

转载自blog.csdn.net/qq_29787335/article/details/76824553