记录新人tp5微信扫码支付

记录新人tp5微信扫码支付

1.开启商户平台相应的支付(最好填入回调地址,你的地址是可以直接访问的),下载sdk置于继承文件夹类比如tp5的extend

2.config文件中写入相应的参数,自己的或者sdk的都可以
商户id:MerchantId
商户秘钥:key
公众账号id:appId
加密方式最好全部统一选择MD5。

3调用统一下单,一定要填入回调地址,会很方便(图1,2)
在这里插入图片描述
在这里插入图片描述
4返回的二维码url需要经过处理,百度一下你就知道(图3,4)
在这里插入图片描述
在这里插入图片描述
5这样应该就可以显示出可以微信扫码的二维码了
6关于回调方法,我寻找了很多方法,我觉得难点在于怎么观察到回调数据,
不多bb直接放代码,

<?php
namespace app\index\controller;

use think\Controller;
use think\Db;
use think\Log;
//inport('WxPay.WxPay',EXTEND_PATH,'.Notify.php');

class Callback extends Controller
{
    public function callback()
    {


    //获取接口数据,如果$_REQUEST拿不到数据,则使用file_get_contents函数获取
    $post = $_REQUEST;
    if ($post == null) {
        $post = file_get_contents("php://input");//现在好像都是用这种方法
    }

    if ($post == null) {
        $post = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
    }

    if (empty($post) || $post == null || $post == '') {
        //阻止微信接口反复回调接口  文档地址 https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_7&index=7,下面这句非常重要!!!
        $str = '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
        echo $str;
        exit('Notify 非法回调');
    }

    /*****************微信回调返回数据样例*******************
     * $post = '<xml>
     * <return_code><![CDATA[SUCCESS]]></return_code>
     * <return_msg><![CDATA[OK]]></return_msg>
     * <appid><![CDATA[wx2421b1c4370ec43b]]></appid>
     * <mch_id><![CDATA[10000100]]></mch_id>
     * <nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str>
     * <sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign>
     * <result_code><![CDATA[SUCCESS]]></result_code>
     * <prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>
     * <trade_type><![CDATA[APP]]></trade_type>
     * </xml>';
     *************************微信回调返回*****************/

    libxml_disable_entity_loader(true); //禁止引用外部xml实体

    $xml = simplexml_load_string($post, 'SimpleXMLElement', LIBXML_NOCDATA);//XML转数组

    $post_data = (array)$xml;
    dump($post_data);

    /** 解析出来的数组
     *Array
     * (
     * [appid] => wx1c870c0145984d30
     * [bank_type] => CFT
     * [cash_fee] => 100
     * [fee_type] => CNY
     * [is_subscribe] => N
     * [mch_id] => 1297210301
     * [nonce_str] => gkq1x5fxejqo5lz5eua50gg4c4la18vy
     * [openid] => olSGW5BBvfep9UhlU40VFIQlcvZ0
     * [out_trade_no] => fangchan_588796
     * [result_code] => SUCCESS
     * [return_code] => SUCCESS
     * [sign] => F6890323B0A6A3765510D152D9420EAC
     * [time_end] => 20180626170839
     * [total_fee] => 100
     * [trade_type] => JSAPI
     * [transaction_id] => 4200000134201806265483331660
     * )
     **/
    //订单号
    $out_trade_no = isset($post_data['out_trade_no']) && !empty($post_data['out_trade_no']) ? $post_data['out_trade_no'] : 0;

    //根据商户订单号查询订单信息
    $order_info = Db::table('order_goods')
        ->where('order_id', '=', "$out_trade_no")
        ->select();


    if (count($order_info) > 0) {
        //查询平台信息

        //平台支付key
        $wxpay_key = '64b9784fbd24fe704a6f86bccb41ad3c';;

        //接收到的签名
        $post_sign = $post_data['sign'];
        unset($post_data['sign']);

        //重新生成签名
        $newSign = self::MakeSign($post_data, $wxpay_key);

        //签名统一,则更新数据库
        if ($post_sign == $newSign) {
           //这里开始自己的处理方式
        }
    }

    //阻止微信接口反复回调接口  文档地址 https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_7&index=7,下面这句非常重要!!!
    $str = '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
    echo $str;
}
    function MakeSign($params, $key)
    {
        //签名步骤一:按字典序排序数组参数
        ksort($params);
        $string = self::ToUrlParams($params);  //参数进行拼接key=value&k=v
        //签名步骤二:在string后加入KEY
        $string = $string . "&key=" . $key;
        //签名步骤三:MD5加密
        $string = md5($string);
        //签名步骤四:所有字符转为大写
        $result = strtoupper($string);
        return $result;
    }

    function ToUrlParams($params)
    {
        $string = '';
        if (!empty($params)) {
            $array = array();
            foreach ($params as $key => $value) {
                $array[] = $key . '=' . $value;
            }
            $string = implode("&", $array);
        }
        return $string;
    }
}

这个方法也是我观看百度上很多前辈加上自己的写出来的,很简陋,
最后,对于像我这种小白来说,这个调试,一定一定要打开日志,百度下所用框架的日志位置,调试记得运行就重新拉下新的日志
看到这里应该就差不多弄出来了,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值