• 关于ThinkPHP下微信扫码支付的记录(模式二)


    1.获取二维码

    function get_wx_src(){

    //模式二
    /**
    * 流程:
    * 1、调用统一下单,取得code_url,生成二维码
    * 2、用户扫描二维码,进行支付
    * 3、支付完成之后,微信服务器会通知支付成功
    * 4、在支付成功通知中需要查单确认是否真正支付成功(见:notify.php)
    */
    $out_trade_no = I('post.code');  //系统订单号
    if(C('pay_test_switch')===true) {  //是否开启正式支付
    $total_fee = 1; //付款金额 //必填 通过支付页面的表单进行传递 1fen
    }else{
    $total_fee = I('post.order_last_fee') * 100;
    }
    $attach = "自定义字符串"
    $notify = new NativePay();
    $input = new WxPayUnifiedOrder();
    $input->SetBody('赞赞的商品描述'); //商品简单描述
    $input->SetAttach($attach); //附加数据,可作为自定义参数
    $input->SetOut_trade_no($out_trade_no); //订单号,32个字符内
    $input->SetTotal_fee($total_fee); //订单总金额,单位为分
    $input->SetTime_start(date("YmdHis")); //订单生成时间
    $input->SetTime_expire(date("YmdHis", time() + 600)); //订单失效时间
    $input->SetGoods_tag("test"); //订单优惠标记
    $input->SetNotify_url(C('wxpay_config.notify_url')); //服务器异步通知页面路径)
    $input->SetTrade_type("NATIVE"); //交易类型--扫码支付
    $input->SetProduct_id($out_trade_no); // NATIVE 时必传,商品id
    $result = $notify->GetPayUrl($input);
    $url = $result["code_url"];    //支付Url

    $data['error'] = 0;
    $data['url'] = $url;
    return $this->ajaxReturn($data);

    }

    2.服务器的异步通知方法

    /******************************
    服务器异步通知页面方法

    *******************************/
    /**
    * 验证
    * @return array 返回数组格式的notify数据
    */
    public function notifyurl(){

    // 获取xml
    $xml=file_get_contents('php://input','r');

    // 转成php数组
    $data=$this->toArray($xml);

    if ($data['return_code']=='SUCCESS' && $data['result_code']=='SUCCESS') {  //判断状态是否为返回成功

    $out_trade_no = $data["out_trade_no"];
    $input = new WxPayOrderQuery();
    $input->SetOut_trade_no($out_trade_no);
    $result = WxPayApi::orderQuery($input);  //去微信服务器验证正确性

    if ($result['return_code']=='SUCCESS' && $result['result_code']=='SUCCESS'){  //真正的验证通过
    $result=$data;
    $openid = $data['openid']; //用户标识
    $trade_type = $data['trade_type']; //交易类型 NATIVE
    $total_fee = $data['total_fee']; //订单金额
    $transaction_id = $data['transaction_id']; //微信支付订单号
    $attch = $data['attach']; //自定义信息
    $out_trade_no = $data['out_trade_no']; //订单code
    $time_end= $data['time_end']; //订单code

    $extra_info = explode(',',$attch);
    //add wx

    $parameter = array(  // 存储微信支付信息
    'code' => $out_trade_no,
    'transaction_id' => $transaction_id,
    'openid' => $openid,
    'total_fee' => $total_fee,
    'trade_type' => $trade_type,
    'time_end' => $time_end,
    'create_time' => time()
    );
    }else{
    $result=false;
    }
    }else{
    $result=false;
    }
    // 返回状态给微信服务器
    if ($result) {
    $str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
    }else{
    $str='<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>';
    }
    echo $str;

    }

    3.其他方法

    /**
    * 将xml转为array
    * @param string $xml xml字符串
    * @return array 转换得到的数组
    */
    public function toArray($xml){
    //禁止引用外部xml实体
    libxml_disable_entity_loader(true);
    $result= json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
    return $result;
    }

  • 相关阅读:
    详细解读 DispatcherServlet 初始化过程(带时序图)
    从源码分析ContextLoaderListener的加载过程(带时序图)
    SpringMVC自带Cron定时器Demo及常见问题
    win7系统用sqlyog连接不上docker启动的mysql数据库
    使用maven-Jetty9-plugin插件运行第一个Servlet
    Maven项目+内嵌tomcat+Servlet
    Maven依赖的scope属性(附官方文档)
    使用 Intellij IDEA 新建一个 Servlet 项目
    在 Tomcat 上部署你的第一个 Servlet 应用
    关于JAVA的垃圾回收机制
  • 原文地址:https://www.cnblogs.com/xiledada/p/7390104.html
Copyright © 2020-2023  润新知