微信支付——jaspi支付

原创 2016年08月30日 14:00:34

项目环境:thinkphp

感叹:到处是坑!!!!!

注意点:第一点,网页授权获取openid,应用微信插件laneWeChat (微信开发框架)

第二点,获取openid要跳转几次页面把openid值保存到session中或是url地址中

第三点,授权目录的地址与访问地址的大小写要一直

流程:

1,下载插件lanewechat放到thinkphp,verdor目录底下,并配置好


代码段配置



微信端配置


2,入口页面函数

public function new_pay(){
   //全局引入微信支付类
   vendor('WxPay.lib.WxPay.Api');

   //=========步骤1:网页授权获取用户openid============
   //①、获取用户openid
   $tools = new \JsApiPay();
   $openId = $tools->GetOpenid();

}


3,进入getopenid()类,此时进入的code为空值,跳转到Paynew目录下getcode控制器index函数
public function GetOpenid($fromurl)
{ 
     if (!isset($_GET['code'])){
         //触发微信返回code码
         $baseUrl = urlencode('http://luochao.tunnel.qydev.com/yershopv/index.php/PayNew/GetCode/index'.$_SERVER['QUERY_STRING']);
         $url = $this->__CreateOauthUrlForCode($baseUrl);
         Header("Location:$url");
            redirect($url);

         exit();
      } else {
         //获取code码,以获取openid
          $code = $_GET['code'];
         $openid = $this->getOpenidFromMp($code);
            redirect(session('ect')."?openid=".$openid);
         return $openid;
      }
   }

4,getcode控制处理,载入lanewechat类插件获得code值,根据code值获取openid值,把openid值保存到session或url中都可以,在跳转

<?php

namespace PayNew\Controller;
vendor('LaneWeChat.lanewechat');
use LaneWeChat\Core\WeChatOAuth;

class GetCodeController
{
    function index()
    {
        //第一步,获取CODE

        //此时页面跳转到了http://www.lanecn.com/index.php,code和state在GET参数中。

        $code = $_GET['code'];
        echo "code:".$code."<br>";
        echo "ur:".$ur."<br>";


        //第二步,获取access_token网页版
        $openId = WeChatOAuth::getAccessTokenAndOpenId($code); //获得openid值
        $opid = $openId['openid'];

        echo 'openid='.$opid."<br>";
        //第三步,获取用户信息
        $ur = "http://luochao.tunnel.qydev.com/yershopv/index.php/Wxpay/getOpenid.html";

//        $_SESSION["openid"]=$opid;
        $url=$ur."?openid=".$opid; //把openid值存到url中
        echo $url;
        redirect($url); //跳转到指定页面
    }
}


5,在url中获取openid值,并执行一下步骤

function getOpenid()
   {
       $url = $_SERVER['QUERY_STRING']; //获取url地址“?”后面的字符串“openid=xxxxxxxxx”
      $openidurl = explode('=',$url);  //已“=”分隔为数组
      $openid = $openidurl[1]; // 拿到openid的值


      //②、统一下单
      $tools = new \JsApiPay();
      $input = new \WxPayUnifiedOrder();

      $input->SetBody("test");//商品或支付单简要描述
      $input->SetAttach("test");//附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
      $input->SetOut_trade_no(\WxPayConfig::MCHID . date("YmdHis"));
      $input->SetTotal_fee("1");//订单总金额,只能为整数,单位为分
      $input->SetTime_start(date("YmdHis"));//订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010
      $input->SetTime_expire(date("YmdHis", time() + 600));//订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010
      $input->SetGoods_tag("test");//商品标记,代金券或立减优惠功能的参数,说明详见代金券或立减优惠
      $input->SetNotify_url(dirname('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']) . '/notify.php');

      $input->SetTrade_type("JSAPI");//取值如下:JSAPI,NATIVE,APP
      $input->SetOpenid($openid);//trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识。下单前需要调用【网页授权获取用户信息】接口获取到用户的Openid

      $order = \WxPayApi::unifiedOrder($input);//统一下单 接口  //这里的openid值传错会出现签名错误,key值错误也会出现签名错误,参数要传正确

      echo '<font color="#f00"><b>订单信息</b></font><br/>';

      $jsApiParameters = $tools->GetJsApiParameters($order);//jsapi支付的参数

      //获取共享收货地址js函数参数
      $editAddress = $tools->GetEditAddressParameters();

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

   }

6,视图页面(getopenid.html),直接拿的微信官方页面,要做一些修改

把原来的
//          WeixinJSBridge.log(res.err_msg);
//          alert(res.err_code+res.err_desc+res.err_msg);
注释掉,改成红色区域代码快,目的是判断支付结果,若支付成功跳转到控制器jsapisuccess函数(url传个orderid过去)
 function jsApiCall()
        {
            WeixinJSBridge.invoke(
                    'getBrandWCPayRequest',
            <?php echo $jsApiParameters; ?>,
            function(res){
                //判断支付结果跳转到cotroll函数页面,做订单支付成功处理,传orderid
                if (res.err_msg == 'get_brand_wcpay_request:cancel') {
                    alert("您已取消了此次支付");
//                    document.location.href = "http://"+location.hostname+"/index.php?g=Mpage&m=MManage&a=PayFail&orderid="+{$orderid};
                    return;
                } else if (res.err_msg == 'get_brand_wcpay_request:fail') {
                    alert("支付失败,请重新尝试");
                    return;
                } else if (res.err_msg == 'get_brand_wcpay_request:ok') {
                    alert("支付成功!");
                    document.location.href = 'http://luochao.tunnel.qydev.com/yershopv/index.php/Pay/jsapisuccess.html?orderid={$orderid}';
                } else {
                    alert("未知错误" + res.error_msg);
                    return;
                }
//          WeixinJSBridge.log(res.err_msg);
//          alert(res.err_code+res.err_desc+res.err_msg);
            }
        );
        }


7,支付成功跳转过来到 pay/jsapisuccess 处理付款成功后的订单
/**
 * jsapi支付成功
 */
public function jsapisuccess(){
   //获取url地址问号后面的字符“orderid=xxxxxxx”,分隔为数组,去除orderid值
   $url = $_SERVER['QUERY_STRING'];
   $orderidurl = explode('=',$url);
   $orderid = $orderidurl[1];

   if ( !empty($orderid) ){ //orderid判断不为空
      /**订单支付成功操作*/
      $jsapiMoney = session("jsapiMoney");//从seesion获取到支付金额 支付提交是要把金额保存到session,在这里调用
      $money = $jsapiMoney / 100 ;
      /*修改订单状态为已支付*/
      $dataa = array('status'=>'1','ispay'=>'2');//订单已经支付,状态为已提交
      $info = M('order')->where(array('tag' => $orderid))->setField($dataa);
      if(!empty($info)){
      } else{
         M('order')->where(array('orderid' => $orderid))->setField($dataa);
      }
      /*支付完后写入到支付表中*/
      M("Pay")->add(array(
         'out_trade_no' => $orderid,
         'money' => $money,
         'status' => 0,
         'create_time' => time(),
         'update_time' => time()
      ));
      $this->display('Pay/over');
   }

}

8,跳转到Pay/over支付完成页面,至此整个jsapi支付流程完成



版权声明:本文为博主原创文章,未经博主允许不得转载。

Android——微信支付功能模块的嵌入

前言 移动支付是目前主流的支付手段,目前主流的支付第三方工具就有支付宝跟微信;下面分析一下如何在你的APP里面嵌入微信支付。 一,申请微信支付资格  (1) 进入微信开发平台  (2)选择微信A...

微信公众号开发中遇到的问题——支付(二)

第一次开发微信公众号,也是第一次接触微信公众号的支付,我使用的是jssdk,用h5页面调用的支付,后台使用的是java。首先声明,我不是一个愤世嫉俗的人,也不喜欢吐槽,我认为别人提供接口就已经很不错了...

策略模式——你要用支付宝还是微信?

在生活中我们有很多选择,你想喝一种饮料,你可以选择可乐,芬达,加多宝等等;你想去旅行,可以选择单车,步行,货车,火车各种你喜欢的方式。那么你用代码怎么去表达呢,一般情况下,很多人会选择if...els...

微信移动支付接口申请——2016年5月版

微信移动支付接口申请——2016年5月版 (又新又全面)
  • Kinsity
  • Kinsity
  • 2016年05月24日 16:06
  • 4847

微信公众号开发中遇到的问题——支付回调,分享,获取openId(三)

微信的统一下单接口(https://api.mch.weixin.qq.com/pay/unifiedorder)中,下单时,有这样一个参数:notify_url,该参数是为接收微信支付异步通知回调的...

补坑筆記[1]——微信公众号支付

补充说明:       今天,遇到微信支付被大牛(我尊重你,但不认同你)攻破的情况,损失80k,好在公司没太怪我,分析后,明白一点,尽全力不要使用前端的数据提交,需要进行后端的数据判断,我采用的根据关...

微信支付JSAPI开发——官方Demo的错误、自定义参数传递

可能有些地方说的不是很好,不理解的可以私聊我或者在评论区发表,我基本每天都会抽出时间逛逛CSDN的。求不喷就行T_T。 之前接了一个项目,开发微信端的一个商城。在一开始开发过程中,并没有遇到什么...

微信支付——开发体系

有了微信支付方面的一些前期准备以及理论知识后,我们可以开始打造我们的微信支付平台了。 商户向微信公众号提供企业以及银行账户资料,商户功能审核通过后,可以获得以下账户包括财付通的商户账户,用于公众号支付...

Android——微信支付

写在前面的话 应用要接入微信登录,分享,需要在微信的开发者平台上进行提交应用,并且审核通过,应用已经获取到appId和支付能力。 相关jar包下载地址:http://download.cs...

我走过最长的路是你的套路——Android端微信支付填坑之路

我走过最长的路是你的套路——Android端微信支付填坑之路
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:微信支付——jaspi支付
举报原因:
原因补充:

(最多只允许输入30个字)