ThinkPHP5微信手机支付

10 篇文章 0 订阅
4 篇文章 0 订阅
  1. 下载demo放置在vendor目录下在这里插入图片描述
    在这里插入图片描述
  2. 配置好config在这里插入图片描述
  3. 微信商户平台配置到支付目录(一定是目录,不是方法)

js调起支付方法

 //调用微信JS api 支付
  function jsApiCall()
  {
    var item_id = {$payinfo['item_id']};
    var data={$data};
    WeixinJSBridge.invoke(
      'getBrandWCPayRequest', data, 
      function(res){
        WeixinJSBridge.log(res.err_msg); 
          if(res.err_msg == "get_brand_wcpay_request:ok"){  
            alert("支付成功!");
           window.location.href="";//支付成功,发货处理方法
          }else if(res.err_msg == "get_brand_wcpay_request:cancel"){  
            alert("用户取消支付!");
            window.location.href="";  //支付取消处理方法
          }else{  
            alert("支付失败!");  
           window.location.href="";//支付失败处理方法
          }  
      }
    );
  }
 
  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();
    }
  }

PHP支付类

<?php 
namespace app\*\controller;

use think\Controller; 
use think\Session;  

use app\*\model\ConfigCommodityInfo;  
use app\*\model\RecordOrder;  

class Pay extends Controller

{
    public function _initialize()
    {
        parent::_initialize();  
        $this->info = new ConfigCommodityInfo();  
        $this->order = new RecordOrder();   
    } 
   
    //统一下单 调取微信支付接口 
    public function pay($item_id,$order_sn,$openid)
    { 
        vendor('pay.WxPayApi') ; 
        vendor('pay.WxPayJsApiPay'); 
        $tools = new \JsApiPay();
        $order = new \WxPayApi();
         
        $appid = '*'; 
        $payinfo = $this->info->selCommodityInfoId($item_id);
  
        define("PARTERKEY",$payinfo['item_id']); 
        $input = new \WxPayUnifiedOrder(); 
        $input->SetBody($payinfo['item_title']);                    //商品名称
        $input->SetAttach('$attach');                 //附加参数,可填可不填,填写的话,里边字符串不能出现空格
        $input->SetOut_trade_no($order_sn);         //订单号
        $input->SetTotal_fee($payinfo['unit_price'] *100);           //支付金额,单位:分换成元*100
        $input->SetTime_start(date("YmdHis", time() ));      //支付发起时间
        $input->SetTime_expire(date("YmdHis", time() + 6000));//支付超时
        $input->SetGoods_tag("test3");
        
        $input->SetNotify_url("/agent/coupon/notify");
        $input->SetTrade_type("JSAPI");             //支付类型
        $input->SetOpenid($openid);                 //用户openID
        $input->SetAppid($appid);
     
        $order = $order->unifiedOrder($input);    //统一下单 
        $jsApiParameters = $tools->GetJsApiParameters($order);
        return $jsApiParameters;
    }


    public function imstr($field){
        $str = '';
        foreach ($field as $key) {
            $str .= "`v`."."`".$key."`,";
        }
        return trim($str,',');
    }

    //微信支付回调验证
    public function notify(){
        $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
        $data = xmlToArray($xml);
        // 保存微信服务器返回的签名sign
        $data_sign = $data['sign'];
        // sign不参与签名算法
        unset($data['sign']);
        $sign = $this->makeSign($data);
        
        // 判断签名是否正确  判断支付状态
        if ( ($sign===$data_sign) && ($data['return_code']=='SUCCESS') && ($data['result_code']=='SUCCESS') ) {
            $result = $data; 
            file_put_contents('./Api/wxpay/logs/log1.txt',$xml,FILE_APPEND); 
            //获取服务器返回的数据
            $order_sn = $data['out_trade_no'];  //订单单号
            $order_id = $data['attach'];        //附加参数,选择传递订单ID 
            $openid = $data['openid'];          //付款人openID
            $total_fee = $data['total_fee'];    //付款金额 
            //更新数据库
            $this->updateDB($order_id,$order_sn,$openid,$total_fee);
        }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;
        return $result;
    }
    /**
    * 生成签名
    * @return 签名,本函数不覆盖sign成员变量
    */
    protected function makeSign($data){
        //获取微信支付秘钥
        vendor('pay.WxPayApi') ;
        $key = \WxPayConfig::KEY;
        // 去空
        $data=array_filter($data);
        //签名步骤一:按字典序排序参数
        ksort($data);
        $string_a=http_build_query($data);
        $string_a=urldecode($string_a);
        //签名步骤二:在string后加入KEY
        //$config=$this->config;
        $string_sign_temp=$string_a."&key=".$key;
        //签名步骤三:MD5加密
        $sign = md5($string_sign_temp);
        // 签名步骤四:所有字符转为大写
        $result=strtoupper($sign);
        return $result;
    }
}
//数据库订单生成一级微信订单生成
public function buy_order()
{

	$item_id = input('item_id');
	$payinfo = $this->info->selCommodityInfoId($item_id);
	$payinfo['order_create_time'] = date('Y-m-d H:i:s',time()) ;
	$order_sn = time() . rand(1000,9999);
	$payinfo['order_id'] = $order_sn; 
   $openid = Session::get('front_pay_openid'); 

	$res['order_id'] = $order_sn;
    $res['goods_id'] = $payinfo['item_id'];
    $res['user_id'] = Session::get('user_id');
    $res['goods_total_price'] = $payinfo['unit_price'];
    $res['order_create_time'] = time().'000';
    $this->order->addOrder($res);//数据库生成订单
	$this->assign('payinfo',$payinfo);

	$data = $this->pay->get_paysign($item_id,$order_sn,$openid);//微信支付订单生成(商品ID,订单号,微信用户openid)
	$this->assign('data',$data);

	return $this->fetch();
}
微信用户openid获取方法
 public function get_openid()
{
     vendor('pay.WxPayApi') ;
     vendor('pay.WxPayJsApiPay');
     if(empty(Session::get('front_pay_openid'))){
         $pay = new \JsApiPay();
         $openid = $pay->GetOpenid();  
         Session::set('front_pay_openid',$openid);   
     }  
 }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值