2016-08-17 13:21:22 hu285279904 阅读数 1261
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27860 人正在学习 去看看 秦子恒

前言

最近在做一个web app是个商城里面需要集成微信支付,在开发的过程中遇到许多坑。
本次主要介绍签名错误,其实造成签名的错误有很多。

正文 

我这里只介绍 由于网络请求参数StringEntity编码错误造成的签名错误。StringEntity 使用ISO8859-1编码就可以了。
代码如下
public static String httpPost(String url, String entity) {
        String result = "";
        //HttpClient client = HttpClients.createDefault();
        HttpClient client = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        try {
            //httpPost.setEntity(new StringEntity(entity));
            httpPost.setEntity(new StringEntity(new String(entity.getBytes(), "ISO8859-1")));
            HttpResponse httpResponse = client.execute(httpPost);
            //否则会乱码
            result = EntityUtils.toString(httpResponse.getEntity(), "utf-8");
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }



2019-04-30 22:04:47 line233 阅读数 1564
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27860 人正在学习 去看看 秦子恒

在使用微信小程序开发工具时,提醒我有版本更新,然后我就更新了,再然后······再然后就打不开了,刚开始显示未知错误,在网上找了很多办法都没有解决,于是卸载重新安装,重装也不行,如果不是因为电脑上有好多应用再重装太麻烦,我就重装系统了(~~~~~~)

重装了几遍之后,问题又成了网络连接失败,终于在一遍重装时发现安装提示,在安装过程中应该将其他程序关闭,于是重启了电脑,保证所有的程序都没有启动,然后重新安装,此次安装就成功了,可以正常运行

2017-03-12 22:53:34 huangxiaoguo1 阅读数 12274
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27860 人正在学习 去看看 秦子恒

今天学习了一下微信小程序的入门开发,在使用网络请求时,发现根据微信官方的API的方法进行操作出现Invalid request 400错误,到底怎么回事呢?

  • 首先我们来看微信API网络请求 示例代码:
wx.request({
  url: 'test.php', //仅为示例,并非真实的接口地址
  data: {
     x: '' ,
     y: ''
  },
  header: {
      'content-type': 'application/json'
  },
  success: function(res) {
    console.log(res.data)
  }
})
  • 我项目中的代码
wx.request({
    url: 'https://api.douban.com/v2/movie/in_theaters', //仅为示例,并非真实的接口地址
    data: {},
    method: 'get', 
    header: {
        'content-type': 'application/json'
    },
    success: function(res) {
        console.log(res.data)
        }
    })

但是发现会出现400错误。

错误提示如下所示:

这里写图片描述

这是怎么回事呢?

后来发现,微信开发者工具在更新到最新版本后(我现在使用的版本是0.14.140900),相应的参数配置也发生了变化,官网给出的这个配置已经不能用了,需要改为'Content-Type': 'json'

这里写图片描述

 wx.request({
    url: 'https://api.douban.com/v2/movie/in_theaters', //仅为示例,并非真实的接口地址
    data: {},
    method: 'get', 
    header: {
        // 'content-type': 'application/json'
        'Content-Type': 'json'
    },
    success: function(res) {
        console.log(res.data)
        }
    })

结果如下:

这里写图片描述

2019-11-13 13:31:48 Utro669 阅读数 15
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27860 人正在学习 去看看 秦子恒

可能登录的微信账号不是开发者的账号,或者AppID错误。

这种情况会造成验证无法通过,导致失败。

2018-12-23 20:18:23 weixin_43785791 阅读数 2032
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27860 人正在学习 去看看 秦子恒

第一次写,主要给自己看,记录一下
利用微信开发者工具开发商城类微信小程序,开发微信支付必不可少,但微信支付api开发文档说明压根看不懂,自己摸索,运行报错找不到错误代码解决方法
先说说我的开发流程吧
小程序前端——小程序js网络请求php后台——后台接收小程序传回数据——微信支付官网下载sdk包——微信商户配置——sdk配置——签名验证获取prepay_id——传回前端调用微信支付api——完成

想要完成微信支付就必须获取由微信系统后台传回的prepay_id,就必须要生成正确的签名

微信官方文档说明

  1. 查看小程序appid,商户号,商户key,小程序密钥是否正确匹配
  2. 检查签名拼接是否按要求拼接,用签名验证工具验证一下https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1
  3. 修改商户key,原封不动的改一次 key设置路径:微信商户平台(pay.weixin.qq.com)–>账户设置–>API安全–>密钥设置
  4. 检查商户是否对支付目录授权,必须授权才可以,然后商户对appid授权会生成一个商户号对应
    我就是败在了第4点上,检查了一遍又一遍发现没有授权目录与appid,因为商户号是可变动的,一定要与appid匹配我就是败在了第4点上,检查了一遍又一遍发现没有授权目录与appid,因为商户号是可变动的,一定要与appid匹配

签名算法

<?php
/*
 * 小程序微信支付
 */
class WeixinPay {
    protected $appid;
    protected $mch_id;
    protected $key;
    protected $openid;
    protected $out_trade_no;
    protected $body;
    protected $total_fee;
            function __construct($appid, $openid, $mch_id, $key,$out_trade_no,$body,$total_fee) {
        $this->appid = $appid;
        $this->openid = $openid;
        $this->mch_id = $mch_id;
        $this->key = $key;
        $this->out_trade_no = $out_trade_no;
        $this->body = $body;
        $this->total_fee = $total_fee;
    }


    public function pay() {
        //统一下单接口
        $return = $this->weixinapp();
        return $return;
    }


    //统一下单接口
    private function unifiedorder() {
        $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
		$jjc=$this->createNoncestr();
        $parameters = array(
            'appid' => $this->appid,
            'body' => $this->body,
            'mch_id' => $this->mch_id,
            'nonce_str' => $jjc,
            'notify_url' => 'https://*************/notify.php',
            'openid' => $this->openid, 
            'out_trade_no'=> $this->out_trade_no,
            'spbill_create_ip' => '*********',//授权目录的ip地址
            'total_fee' => $this->total_fee,
            'trade_type' => 'JSAPI'
        );
	$t="appid=".$this->appid."&body=".$this->body."&mch_id=".$this->mch_id."&nonce_str=".$jjc."&notify_url=https://*************/notify.php&openid=".$this->openid."&out_trade_no=".$this->out_trade_no."&spbill_create_ip=************&total_fee=".$this->total_fee."&trade_type=JSAPI"; 
        $t=$t."&key=************************************";
	$sign=strtoupper(md5($t));
	$parameters['sign']=$sign;
        $xmlData = $this->arrayToXml($parameters);
        $return = $this->xmlToArray($this->postXmlCurl($xmlData, $url, 60));
        return $return;
    }


    private static function postXmlCurl($xml, $url, $second = 30) 
    {
        $ch = curl_init();
        //设置超时
        curl_setopt($ch, CURLOPT_TIMEOUT, $second);
        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_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
        curl_setopt($ch, CURLOPT_TIMEOUT, 40);
        set_time_limit(0);


        //运行curl
        $data = curl_exec($ch);
        //返回结果
        if ($data) {
            curl_close($ch);
            return $data;
        } else {
            $error = curl_errno($ch);
            curl_close($ch);
            throw new WxPayException("curl出错,错误码:$error");
        }
    }
    
    
    
    //数组转换成xml
    private function arrayToXml($arr) {
        $xml = "<root>";
        foreach ($arr as $key => $val) {
            if (is_array($val)) {
                $xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">";
            } else {
                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
            }
        }
        $xml .= "</root>";
        return $xml;
    }


    //xml转换成数组
    private function xmlToArray($xml) {


        //禁止引用外部xml实体 


        libxml_disable_entity_loader(true);


        $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);


        $val = json_decode(json_encode($xmlstring), true);


        return $val;
    }


    //微信小程序接口
    private function weixinapp() {
        //统一下单接口
        $unifiedorder = $this->unifiedorder();
//        print_r($unifiedorder);
	$jjc=$this->createNoncestr();
        $parameters = array(
            'appId' => $this->appid, //小程序ID
	    	'nonceStr' => $jjc, //随机串
            'package' => 'prepay_id=' . $unifiedorder['prepay_id'], //数据包
            'signType' => 'MD5',//签名方式
            'timeStamp' => '' . time() . '' //时间戳
        );
        //签名
	$t="appId=".$this->appid."&nonceStr=".$jjc."&package=prepay_id=".$unifiedorder['prepay_id']."&signType=MD5&timeStamp=".time(); 
        $t=$t."&key=*************************";
	$sign=strtoupper(md5($t));
        $parameters['paySign'] = $sign;
        return $parameters;
    }


    //作用:产生随机字符串,不长于32位
    private 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;
    }


    //作用:生成签名
    private function getSign($Obj) {
        foreach ($Obj as $k => $v) {
            $Parameters[$k] = $v;
        }
        //签名步骤一:按字典序排序参数
        ksort($Parameters);
        $String = $this->formatBizQueryParaMap($Parameters, false);
        //签名步骤二:在string后加入KEY
        $String = $String . "&key=" . $this->key;
        //签名步骤三:MD5加密
        $String = md5($String);
        //签名步骤四:所有字符转为大写
        $result_ = strtoupper($String);
        return $result_;
    }


    ///作用:格式化参数,签名过程需要使用
    private function formatBizQueryParaMap($paraMap, $urlencode) {
        $buff = "";
        ksort($paraMap);
        foreach ($paraMap as $k => $v) {
            if ($urlencode) {
                $v = urlencode($v);
            }
            $buff .= $k . "=" . $v . "&";
        }
        $reqPar;
        if (strlen($buff) > 0) {
            $reqPar = substr($buff, 0, strlen($buff) - 1);
        }
        return $reqPar;
    }


}

以上就是我微信支付解决的过程,没有太大的坑,但是记录一下,免的以后自己再次遇到

没有更多推荐了,返回首页