微信JSAPI支付(比较详细) 关于getRrandWCPayRequest:fail_invalid appid 错误

原文:微信JSAPI支付(比较详细) 关于getRrandWCPayRequest:fail_invalid appid 错误

首先微信支付需注册  微信公从平台开发 和 微信支付商户平台

关于4个密钥,如何获得:有图

AppID(应用ID)    :wx000000000 (来自微信公众平台-》开发者中心-》配置项-》开发者ID-》AppID(应用ID))

AppSecret(应用密钥) :62d0000000000000000000ae (来自微信公众平台-》开发者中心-》配置项-》开发者ID-》AppSecret(应用密钥))

商户号        :0000000 (来自微信支付商户平台-》帐号设置 -》帐号信息-》基本帐号信息-》微信支付商户号:00000000 (小知:纯数字))

商户密钥:	  :0c8300000000000000000b (来自您申请微信支付商户平台时发送到你邮件里的一串码,若丢失,可重新申请,步骤:商户平台-》帐户设置-》API安全-》API密钥-》右下角有“设置密钥”)

  

关于代码,我将整理为一个页面:wxpay.php

header("Content-type: text/html; charset=utf-8");
$wx = new wxpay();
$payment = array(
    ‘wxpay_AppSecret‘ => ‘0c830a000000000f12b0b‘,//(来自您申请微信支付商户平台时发送到你邮件里的一串码,若丢失,可重新申请,步骤:商户平台-》帐户设置-》API安全-》API密钥-》右下角有“设置密钥”)
    ‘wxpay_AppID‘ => ‘wx00000000b30‘,//(来自微信公众平台-》开发者中心-》配置项-》开发者ID-》AppID(应用ID))
    ‘wxpay_shanghuID‘ => ‘120000102‘,//(来自微信支付商户平台-》帐号设置 -》帐号信息-》基本帐号信息-》微信支付商户号:00000000 (小知:纯数字))
);
$order = array(
    ‘order_sn‘ => ‘201505191450‘,//这是订单SN
    ‘order_amount‘ => 0.01, //金额
);
$openid = ‘oT0000000000000000GNkNM3s‘;//此OPENID是微信的唯一标识,需用API获得,此贴按下不表,择日发贴$notify_url = "http://m.sgfoot.com/auth/respond.php";//必须是授权目录http://m.sgfoot.com/auth/
echo $wx->get_code($openid, $order, $payment);
/**
 * 微信支付类
 */
class wxpay
{

    var $parameters; // cft 参数
    var $payment; // 配置信息
    /**
     * 生成支付代码
     *
     * @param array $order
     * 订单信息
     * @param array $payment
     * 支付方式信息
     */
    function get_code($openid, $order, $payment, $notify_url)
    {
        // 配置参数
        $this->payment = $payment;        

        //设置必填参数
        //根目录url
        $out_trade_no = $order[‘order_sn‘] . ‘o‘ . rand(1, 100);
        $this->setParameter(‘body‘, $order[‘order_sn‘]);
        $this->setParameter("openid", "{$openid}");//用户唯一标识
        $this->setParameter("out_trade_no", $out_trade_no);//商户订单号
        $this->setParameter("total_fee", $order[‘order_amount‘] * 100);//总金额
        $this->setParameter("notify_url", "{$notify_url}");//通知地址
        $this->setParameter("trade_type", "JSAPI");//交易类型

        $prepay_id = $this->getPrepayId();
        $jsApiParameters = $this->getParameters($prepay_id);
        // wxjsbridge
        $js = ‘<script type="text/javascript">
        function jsApiCall(){WeixinJSBridge.invoke("getBrandWCPayRequest",‘.$jsApiParameters.‘,function(res){if(res.err_msg == "get_brand_wcpay_request:ok"){location.href="/respond.php?code=wxpay&status=1&subject=‘.$out_trade_no.‘"}else{window.location.href="respond.php?code=wxpay&status=0&subject="}});}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>‘;
        $button = ‘<div style="text-align:center"><button class="c-btn3" type="button" onclick="callpay()" style="background:#f16681;display:inline-block;padding:5px 10px;border-radius:3px;font-size:14px;color:#fff;border:1px solid #fff;" >微信安全支付</button></div>‘ . $js;
        return $button;
    }

    function trimString($value)
    {
        $ret = null;
        if (null != $value)
        {
            $ret = $value;
            if (strlen($ret) == 0)
            {
                $ret = null;
            }
        }
        return $ret;
    }

    /**
     *  作用:产生随机字符串,不长于32位
     */
    public function createNoncestr( $length = 32 )
    {
        $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
        $str ="";
        for ( $i = 0; $i < $length; $i++ )  {
            $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
        }
        return $str;
    }

    /**
     *  作用:设置请求参数
     */
    function setParameter($parameter, $parameterValue)
    {
        $this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue);
    }

    /**
     *  作用:生成签名
     */
    public function getSign($Obj)
    {
        foreach ($Obj as $k => $v)
        {
            $Parameters[$k] = $v;
        }
        //签名步骤一:按字典序排序参数
        ksort($Parameters);

        $buff = "";
        foreach ($Parameters as $k => $v)
        {
            $buff .= $k . "=" . $v . "&";
        }
        $String;
        if (strlen($buff) > 0)
        {
            $String = substr($buff, 0, strlen($buff)-1);
        }
        //echo ‘【string1】‘.$String.‘</br>‘;
        //签名步骤二:在string后加入KEY
        $String = $String."&key=".$this->payment[‘wxpay_AppSecret‘];
        //echo "【string2】".$String."</br>";
        //签名步骤三:MD5加密
        $String = md5($String);
        //echo "【string3】 ".$String."</br>";
        //签名步骤四:所有字符转为大写
        $result_ = strtoupper($String);
        //echo "【result】 ".$result_."</br>";
        return $result_;
    }

    /**
     *  作用:以post方式提交xml到对应的接口url
     */
    public function postXmlCurl($xml,$url,$second=30)
    {
        //初始化curl
        $ch = curl_init();
        //设置超时
        curl_setopt($ch, CURLOP_TIMEOUT, $second);
        //这里设置代理,如果有的话
        //curl_setopt($ch,CURLOPT_PROXY, ‘8.8.8.8‘);
        //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
        curl_setopt($ch,CURLOPT_URL, $url);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
        //设置header
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        //要求结果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        //post提交方式
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
        //运行curl
        $data = curl_exec($ch);

        curl_close($ch);
        //返回结果
        if($data)
        {
            curl_close($ch);
            return $data;
        }
        else
        {
            $error = curl_errno($ch);
            echo "curl出错,错误码:$error"."<br>";
            echo "<a href=‘http://curl.haxx.se/libcurl/c/libcurl-errors.html‘>错误原因查询</a></br>";
            curl_close($ch);
            return false;
        }
    }

    /**
     * 获取prepay_id
     */
    function getPrepayId()
    {
        //设置接口链接
        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
        try
        {
            //检测必填参数
            if($this->parameters["out_trade_no"] == null){
                throw new Exception("缺少统一支付接口必填参数out_trade_no!"."<br>");
            }elseif($this->parameters["body"] == null){
                throw new Exception("缺少统一支付接口必填参数body!"."<br>");
            }elseif ($this->parameters["total_fee"] == null ) {
                throw new Exception("缺少统一支付接口必填参数total_fee!"."<br>");
            }elseif ($this->parameters["notify_url"] == null) {
                throw new Exception("缺少统一支付接口必填参数notify_url!"."<br>");
            }elseif ($this->parameters["trade_type"] == null) {
                throw new Exception("缺少统一支付接口必填参数trade_type!"."<br>");
            }elseif ($this->parameters["trade_type"] == "JSAPI" && $this->parameters["openid"] == NULL){
                throw new Exception("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!"."<br>");
            }
            $this->parameters["appid"] = $this->payment[‘wxpay_AppID‘];//公众账号ID
            $this->parameters["mch_id"] = $this->payment[‘wxpay_shanghuID‘];//商户号
            $this->parameters["spbill_create_ip"] = $_SERVER[‘REMOTE_ADDR‘];//终端ip
            $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
            $this->parameters["sign"] = $this->getSign($this->parameters);//签名
            $xml = "<xml>";
            foreach ($this->parameters as $key=>$val)
            {
                 if (is_numeric($val))
                 {
                    $xml.="<".$key.">".$val."</".$key.">"; 

                 }
                 else
                 {
                    $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
                 }
            }
            $xml.="</xml>";
        }catch (Exception $e)
        {
            die($e->getMessage());
        }
        $response = $this->postXmlCurl($xml, $url, 30);
        $result = json_decode(json_encode(simplexml_load_string($response, ‘SimpleXMLElement‘, LIBXML_NOCDATA)), true);
        $prepay_id = $result["prepay_id"];
        return $prepay_id;
    }

    /**
     *  作用:设置jsapi的参数
     */
    public function getParameters($prepay_id)
    {
        $timeStamp = time();
        $jsApiObj["appId"] = $this->payment[‘wxpay_AppID‘];
        $jsApiObj["timeStamp"] = "$timeStamp";
        $jsApiObj["nonceStr"] = $this->createNoncestr();
        $jsApiObj["package"] = "prepay_id=$prepay_id";
        $jsApiObj["signType"] = "MD5";
        $jsApiObj["paySign"] = $this->getSign($jsApiObj);
        $this->parameters = json_encode($jsApiObj);
        return $this->parameters;
    }
}

  

关于报 getRrandWCPayRequest:fail_invalid appid 错误。

我的代码是基于ecshop开发的。一直报错。后来单狂拿出来,整理一个文件。将代码放在根目录的auth目录下。

支付目录是 http://m.sgfoot.com/auth/wxpay.php (wxpay.php则是上面的代码)

授权目录则是 http://m.sgfoot.com/auth/

(重点说明:授权目录填写是你支付的页面在哪个目录下就填当前目录下的目录。否则出错,不会弹出支付窗口。)

(经多次测试,如果在网站的根目录下,即使授权了,也报 getRrandWCPayRequest:fail_invalid appid 错误,解决方法则是:放在某目录下,再授权此目录,如果是根目录下,无法完成支付,必须要二级目录或三级等,不知这是微信硬性规定还是BUG)

关于返回页面,如下。放在当前支付目录下。respond.php

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<?php
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
if($_REQUEST[‘status‘] == 1 && isset($_REQUEST[‘subject‘])) {
    echo ‘支付成功‘;
}else {
    echo "支付失败";
}
?>
</body>
</html>

  

时间: 2024-10-07 16:14:35

微信JSAPI支付(比较详细) 关于getRrandWCPayRequest:fail_invalid appid 错误的相关文章

微信JSAPI支付 统一下单 (.net后台)

交流QQ群  ASP.NET鹰组 460845632  我会倾囊相授 我们要做微信支付当配置好微信微信商户和支付配置之后我们首先应该看   https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1# 这是微信统一下单的参数,我将这个参数做成了一个数据模型 当做好这个数据模型之后仔细看一下里面那些参数是必须的,支付金额要注意,微信是按分来计算的 接下来我们就要生成签名,我这写好了个类  生成签名后 返回提交的值.....先给大家看

微信JSApi支付~集成到MVC环境后的最后一个坑(网上没有这种解决方案)

大叔第一人 之前写了关于微信的坑<微信JSApi支付~坑和如何填坑>,今天将微信的jsapi支付封装到了MVC环境里,当然也出现了一些新的坑,如支付参数应该是Json对象而不是Json字符串,这样也会应付引起“get_brand_wcpay_request:fail_invalid appid”这个大家都知道的异常,呵呵,解决方案网上说是“授权目录“,事实上,还有一种原因,那就是你的WeixinJSBridge.invoke方法里的参数应该是Json对象而不是字符串,这才是最重要的. 代码我们

微信JSAPI支付

最近在微信H5页面内集成微信JSAPI支付,遇到不少问题,现将集成步骤及遇到的问题记录如下: 1.官方下载SDK,下载地址:https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php_v3.zip 2.下载之后,只保留存放证书的文件cert(从微信公众平台"API安全"中下载),库文件lib,日志文件logs,以及example里面的notify.php,jsapi.php文件 3.配置WxPay.Config.php文件(

微信JSApi支付~订单号和微信交易号&lt;转&gt;

本文转载自:张占岭 原文链接:http://www.cnblogs.com/lori/p/5364213.html 谈谈transactionId和out_trade_no 前一篇微信JSApi支付~坑和如何填坑文章反映不错,所以又写了个后篇,呵呵. 每个第三方在线支付系统中都会有至少两类订单号,其一为支付系统的订单号,我们称为transactionId,其二为商户平台的订单号,我们通常称为out_trade_no,这两个号一般用来对账,在第三方支付平台你可以通过这两个订单号来查询订单的状态,而

微信内网页支付(微信 JSAPI 支付)的一点经验

微信 JSAPI 支付的流程是:服务端根据情况,向微信服务器发起"下单"请求.此处需要提供自己维护唯一的订单号,并要求签名加密.根据"下单"反馈的微信提供的预支付"订单号",用刚才下单请求参数同样的签名方式,对几个基本数据进行封包签名.将签名摘要,和这几个基本数据,传输给 JavaScript 端.JavaScript 通过微信内置对象的方法,唤起支付,并前端返回支付操作结果.微信服务端会异步通知服务端,支付结果:此处通知地址是之前"下

asp.net微信jsapi支付

1.前台页面: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    <meta name="viewpo

微信JSApi支付~坑和如何填坑&lt;转&gt;

本文转载自:张占岭 原文链接:http://www.cnblogs.com/lori/p/5355550.html 微信一直用着不爽,这几天研究它的jsapi支付,即在微信内打开H5页面,完成支付的过程,在这个过程中,你将会遇到各种各样的问题,而大叔将把这些问题的解决方法写一下,希望可以给你带来帮助! 一 网页授权的域名需要设置 注意:我们设置的域名为当前域名,而不是一级域名,如www.api.com,你不能设置为api.com,而要设置成www.api.com 二 授权目录需要设置 三 JsA

微信公众号JSAPI支付

微信公众号JSAPI支付 一:配置参数 申请成功后,获取接口文件, 将所有文件放入项目根目录weixin下,在WxPay.ub.config.php中填入配置账户信息; 二:设置授权 开发者中心->网页服务->网页授权获取用户基本信息->修改; “授权回调页面域名修改成你的域名地址即可,须保证网页授权已获得,不然会报redirect_uri 参数错误; 三:网页授权获取用户openid js_api_call.php 请求文件中改动(所有传给微信的参数都在入口文件中接收) $out_tr

微信支付-JSAPI支付V3-查询订单

接口链接 https://api.mch.weixin.qq.com/pay/orderquery 请求参数: 字段名 变量名 必填 类型 示例值 描述 公众账号ID appid 是 String(32) wx8888888888888888 微信分配的公众账号ID 商户号 mch_id 是 String(32) 1900000109 微信支付分配的商户号 微信订单号 transaction_id 否 String(32) 013467007045764 微信的订单号,优先使用 商户订单号 ou