thhinkphp5前后端分离微信公众号支付

本人小白,刚接触thinkphp,做了一个微信公众号,重点是前后端分离的,带支付的内种,官方给的接口文档好麻烦,问了好多人终于做出来的,还有一件事,为什么这个东西上传不了文件,我一上传就把我之前的写的全变没了,烦,下面给你们代码


<?php
/**
 * 订单
 * Created by 谁写的我也不知道,反正下面是我改的
 * User: Hcz
 * Date: 2018/7/25
 * Time: 19:06
 */
namespace app\index\controller;
use app\index\controller\Base;
use think\Controller;
use think\Db;
use think\Loader;
use think\Cookie;
use think\Config;
use app\index\model\User;
class Wxpeng extends Controller{
    //下单

    //支付

    /**
     * @param string $order_no  订单号
     * @param string $total  支付金额

    你写个订单表,订单表里要有价格,购买人的id,以及订单id和时间,,把订单表的订单号传进来
    叫做order_no,用order_no去查找其他信息,我的
    订单表叫vip_viporder   用户id叫uid  价格我是另外查询的,你可以自己在订单表里拿



     */
    public function pay(){
        $order_no=input('order_no');
        Loader::import('wxpay.lib.WxPayApi', VENDOR_PATH);
        Loader::import('wxpay.example.WxPayJsApiPay', VENDOR_PATH);
       //$openid = $orderinfo['openid'];
        $res=Db::table('xc_viporder')->where('order_id',$order_no)->find();
        $openid=$res['uid'];
        $vip=$res['vip'];
        $pric=Db::table('xc_huiyuan')->where('vid',$vip)->find();
        //准备数据
        $tools = new \JsApiPay();
        //②、统一下单
        $input = new \WxPayUnifiedOrder();
        //$input->SetBody('购买'.$ordergoodinfo['goods_name']);
        $input->SetBody('购买'.'会员卡');

        $input->SetOut_trade_no($order_no);
        //价格
        $input->SetTotal_fee($pric['money']*100);
        $input->SetTime_start(date("YmdHis"));
        $input->SetTime_expire(date("YmdHis", time() + 600));
        //自己的
        $input->SetNotify_url("http://yfj.sharexwd.top/Index/Wxpeng/asynNotify");
        $input->SetTrade_type("JSAPI");
        $input->SetOpenid($openid);
        $order = \WxPayApi::unifiedOrder($input);
        $jsApiParameters = $tools->GetJsApiParameters($order);
        $this->assign('jsApiParameters',$jsApiParameters);
        return $this->fetch();
    }


    //支付异步回调
    public function asynNotify() {
        $result = file_get_contents('php://input', 'r');
        $result = (array)simplexml_load_string($result, null, LIBXML_NOCDATA);
        //$result=input();
        $num=rand(10000,99999);
        file_put_contents('alipctest_aa'.$num.'.log', print_r($result,true).PHP_EOL,FILE_APPEND);
        Loader::import('wxpay.example.WxPayJsApiPay', VENDOR_PATH);
        $wxpay = new \JsApiPay();
        $orders_no = $result['out_trade_no'];
        //这重点重点
        上面ordersno是订单号,在这里就意味着你已经支付成功了
        在这里写上自己的操作,就比如让扎个订单发货或者更改订单表的状态,就看你自己了







        $config = Config::get('wechat');
        //验证参数
        (($result['result_code'] !== 'SUCCESS') || ($result['mch_id'] !== $config['mch_id']) || ($result['appid'] !== $config['appid'])) && $this->wechatResult('FAIL', 'invalid param');
        //验证签名
        $this->createSign($result, $config['key']) !== $result['sign'] && $this->wechatResult('FAIL', 'invalid sign');
        //修改状态
        $this->wechatResult('SUCCESS', 'OK');  
    }

     /**
     * 生成签名
     * @author Steed
     * @param array $data
     * @param $key
     * @return string
     */
     function createSign($data = [], $key) {
        unset($data['sign']);
        //按ASCII字典序排序
        ksort($data);
        $str = '';
        foreach ($data as $k => $val) {
            $str .= $k . '=' . $val . '&';
        }
        $str .= 'key=' . $key;
        return strtoupper(md5($str));
    }


    //微信回调格式化信息输出
     function wechatResult($code, $msg)
    {
        $xml = '<xml>';
        $xml .= '<return_code><![CDATA[' . $code . ']]></return_code>';
        $xml .= '<return_msg><![CDATA[' . $msg . ']]></return_msg>';
        $xml .= '</xml>';
        echo $xml;
        die;
    }
}

重点
上面的代码放在app\index\controller里,作为控制器,但你会发现她调不起来输入密码页面,诶当时就卡在这了
你把下面代码放在对应的view下,就比如上面文件我叫wxpay,我就在app\index\view\wxpay\index.html
下面是html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
</body>
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script>
    callpay();
    //调用微信JS api 支付
    function jsApiCall()
    {
        WeixinJSBridge.invoke('getBrandWCPayRequest', {$jsApiParameters}, 
        function(res){
        //这里换成你自己的dist文件位置
            window.location.href = "http://yfj.sharexwd.top/dist";
//          if (res.err_msg == 'get_brand_wcpay_request:ok'){
//              
//          }else {              
//              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>
</html>

奉劝大家,微信公众号别用前后端分离,接接口的方式,要做就前段写jquery,给后端,所有数据后端自己做,要不然还有个openid等着你呢

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
2018-09-03 php服务端微信支付整理SDK,封装,如果喜欢请给个好评!谢谢 说明: 配置在 WeChatConfig文件下 环境:php5.6,基于tp5开发 调用统一下单接口: include_once EXTEND_PATH . 'WeChatSDK/WeChatSDK.php'; $data = $this->getOrderInfo($pay_sn); if (!$data) { return $this->resultCode(-2019, '订单不存在或已支付'); } $WeixinPay = new \WeChatSDK(); if ($trade_type == 'JSAPI') { //目前未有此功能 $openid = ''; $product_id = ''; } if ($trade_type == 'NATIVE') { $openid = ''; $product_id = $pay_sn; } if ($trade_type == 'MWEB') { $openid = ''; $product_id = $pay_sn; } if ($trade_type == 'APP') { $openid = ''; $product_id = $pay_sn; } $out_trade_no = $pay_sn; $result = $WeixinPay->setWeiXinPay($data['pay_body'], $data['pay_detail'], $data['pay_money'] * 100, $out_trade_no, $red_url, $trade_type, $openid, $product_id); APP加密:$WeChatSDK->GetAppParameters($result['data']); web编码 $WeChatSDK->GetMwebApiParameters(); jsapi:WeChatSDK-> GetJsApiParameters(); 回调调用: include_once EXTEND_PATH . 'WeChatSDK/WeChatSDK.php'; Log::write("gwgwgwgw---------------------------------进入异步回掉"); $postStr = file_get_contents('php://input'); Log::write("gwgwgwgw---------------------------------" . $postStr); $WeChatSDK = new \WeChatSDK(); if (!empty($postStr)) { $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $check_sign = $WeChatSDK->checkSign($postObj, $postObj->sign); Log::write('-----check_sign-------' . $check_sign . '------------check_sign--------------'); if ($postObj->result_code == 'SUCCESS' && $check_sign == 1) { model('order', 'service')->affirmPayment($postObj->out_trade_no); $xml = "<xml> <![CDATA[SUCCESS]]></return_co

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值