2015-12-28 17:17:23 fly_miss 阅读数 432
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

微信应用开发记录

前端时间在家,朋友介绍开发一个移动应用,即在公众号里面增加一个菜单,然后链接页面通过查询某个银行的附近网点和全部网点。这里有个关键是,在查询附近网点的同时,能够查询出与用户当前的距离,并且能通过百度导航,从当前用户所在地导航到网点。

在这里有两个关键点:
1、如何通过微信的JSSDK,获取当前用户所在的经纬度。
2、如何通过百度地图的API,查询出附近的网点,并获取到网点的经纬度,然后进行导航。

关键点解决方案
1、在微信的JSSDK已经给出相关的API,获取当前用户所在的经纬度。
2、在百度地图的WEBAPI中,也已经给出API,通过查询获取相关数据。

难点和经验
难点1、关于微信JSSDK的验证,微信的验证的难度超过预计,特别是在使用和调试上,经常让人无所适从。
这里吐槽一下:我们看一下JSSDK的说明,简单看一下:
1)、需要引用http://res.wx.qq.com/open/js/jweixin-1.0.0.js
2)、需要配置验证参数:

      wx.config({
                            debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
                            appId: appId, // 必填,公众号的唯一标识
                            timestamp: timestamp, // 必填,生成签名的时间戳
                            nonceStr: nonceStr, // 必填,生成签名的随机串
                            signature: signature,// 必填,签名,见附录1
                            jsApiList: ['getLocation'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
                        });

appId很容易理解,申请的公众号ID。timestamp时间戳怎么来没说,nonceStr签名的随机串怎么生成没说明,signature有说明,通过timestamp、nonceStr、JsapiTicket(7200秒有效)和访问页面Url使用Sha1加密算出signature签名。
微信官方给出PHP的例子,本人使用C#,没用过PHP,还是不知道怎么验证。最后百度了一下,还好已经有人做过了,已经在网上说明。
3)、timestamp产生,(不同语言自己写算法实现,官方有PHP代码)自己写算法实现,生成时间戳 从 1970 年 1 月 1 日 00:00:00 至今的秒数,即当前的时间,且最终需要转换为字符串形式。代码如下:

 public static string getTimestamp()
        {
            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return Convert.ToInt64(ts.TotalSeconds).ToString();
        }

4)、nonceStr产生,(不同语言自己写算法实现,官方有PHP代码)生成签名的随机串,使用MD5签名结果

 public static string getNoncestr()
        {
            Random random = new Random();
            return GetMD5(random.Next(1000).ToString(), "GBK");
        }
        /** 获取大写的MD5签名结果 */
        public static string GetMD5(string encypStr, string charset)
        {
            string retStr;
            MD5CryptoServiceProvider m5 = new MD5CryptoServiceProvider();
            //创建md5对象
            byte[] inputBye;
            byte[] outputBye;
            //使用GB2312编码方式把字符串转化为字节数组.
            try
            {
                inputBye = Encoding.GetEncoding(charset).GetBytes(encypStr);
            }
            catch (Exception ex)
            {
                inputBye = Encoding.GetEncoding("GB2312").GetBytes(encypStr);
            }
            outputBye = m5.ComputeHash(inputBye);
            retStr = System.BitConverter.ToString(outputBye);
            retStr = retStr.Replace("-", "").ToUpper();
            return retStr;
        }

5)、signature产生,这个复杂了,微信官方真的没说清楚,这里分三步走。
*、首先通过APPID和AppSecret,产生Token票据,通过下面链接获取参数:”https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=” + appid + “&secret=” + secret。(7200秒有效)
*、通过Token票据获取JsapiTicket(7200秒有效),通过下面链接获取参数:https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=” + accesstoken + “&type=jsapi
*、通过timestamp、nonceStr、JsapiTicket(7200秒有效)和访问页面Url使用Sha1加密算出signature签名。这里感谢网上高手,我这里给出参考
http://www.cnblogs.com/ysyn/p/4665897.html,但是Sha1加密,少了一步排序,参考开源组件:
最后代码如下:

 /// <summary>
        /// 获取JS-SDK权限验证的签名Signature
        /// </summary>
        /// <param name="ticket"></param>
        /// <param name="noncestr"></param>
        /// <param name="timestamp"></param>
        /// <param name="url"></param>
        /// <returns></returns>
        public static string GetSignature(string ticket, string noncestr, string timestamp, string url)
        {
            var parameters = new Hashtable();
            parameters.Add("jsapi_ticket", ticket);
            parameters.Add("noncestr", noncestr);
            parameters.Add("timestamp", timestamp);
            parameters.Add("url", url);
            return CreateSha1(parameters);
        }
        /// <summary>
        /// sha1加密
        /// </summary>
        /// <returns></returns>
        private static string CreateSha1(Hashtable parameters)
        {
            var sb = new StringBuilder();
            var akeys = new ArrayList(parameters.Keys);
            akeys.Sort();
            foreach (var k in akeys)
            {
                if (parameters[k] != null)
                {
                    var v = (string)parameters[k];
                    if (sb.Length == 0)
                    {
                        sb.Append(k + "=" + v);
                    }
                    else
                    {
                        sb.Append("&" + k + "=" + v);
                    }
                }
            }
            return getSha1(sb.ToString()).ToString().ToLower();
        }
               public static String getSha1(String str)
        {
            //建立SHA1对象
            SHA1 sha = new SHA1CryptoServiceProvider();
            //将mystr转换成byte[]
            ASCIIEncoding enc = new ASCIIEncoding();
            byte[] dataToHash = enc.GetBytes(str);
            //Hash运算
            byte[] dataHashed = sha.ComputeHash(dataToHash);
            //将运算结果转换成string
            string hash = BitConverter.ToString(dataHashed).Replace("-", "");
            return hash;
        }       
 这里有几个关键点,请大家注意,不要走弯路:
 *、返回结果的反序列化,可直接用JsonConvert.DeserializeObject实现
 *、四个参数大小写不能错,特别是Url的大小写,不能错,这个看网上很多走了弯路,可使用location.href.split('#')[0]
 参数的验证地址:有两个要分别验证的(????),为什么微信不一个验证就给人调试验证,让人难以理解。建议微信在增加一个验证调试接口。验证接口http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign,这里验证比较麻烦,通常需要不少时间。
 *、innvalid url domain当前页面所在域名与使用的appid没有绑定,请确认正确填写绑定的域名,如果使用了端口号,则配置的绑定域名也要加上端口号,注意按照域名,填写qq.com
难点2、百度地图WebApi的调用,相对来说就简单多了,只需要BaiduKey就行了,可直接使用http://developer.baidu.com/map/index.php?title=webapi。
2018-12-08 11:55:18 weixin_42579642 阅读数 303
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

 最近小程序项目中,要求做个根据用户当前位置获取周围商家地址,并且按照由近到远排序的需求,所以做一下记录:

根据两点间的经纬度计算距离

 /**
     *  @desc 根据两点间的经纬度计算距离
     *  @param float $lat 纬度值
     *  @param float $lng 经度值
     *  @param $status true KM,M显示;false 只返回M
     */
    function getDistance($lat1, $lng1, $lat2, $lng2, $status = true, $single = true)
    {
        $earthRadius = 6367000;
        //approximate radius of earth in meters
        $lat1 = (floatval($lat1) * pi()) / 180;
        $lng1 = (floatval($lng1) * pi()) / 180;
        $lat2 = (floatval($lat2) * pi()) / 180;
        $lng2 = (floatval($lng2) * pi()) / 180;
        $calcLongitude = $lng2 - $lng1;
        $calcLatitude = $lat2 - $lat1;
        $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);
        $stepTwo = 2 * asin(min(1, sqrt($stepOne)));
        $calculatedDistance = $earthRadius * $stepTwo;
        if (!$single) {
            return round($calculatedDistance);
            exit;
        }
//把大于1000米的转换成km
        if ($status) {
            $m = round($calculatedDistance) / 1000;
            return $m > 1 ? round($m, 1) . "km" : ($m * 1000) . "m";
            //return round($m,2);       //这个是我在程序中用的,以为排序比较方便,大家根据需求选用
        } else {
            return round($calculatedDistance) . "m";
        }
    }

通过距离排序

 /**
     * @param Request $request
     * @return array
     * 获取分类商店,并按距离排序
     */
    public function getShop(Request $request){
        $c_id = $request->get('c_id');
        $lat1 = $request->get('lat');
        $lng1 = $request->get('lng');
        $lat1U = floatval($lat1)+0.01;
        $lat1D = floatval($lat1)-0.01;
        $lng1U = floatval($lng1)+0.01;
        $lng1D = floatval($lng1)-0.01;
        $data = DB::table('hunqing_shop')
            ->where('c_id',$c_id)
            ->where('lat','<',$lat1U)      //获取周围经纬度差0.01的商家距离
            ->where('lat','>',$lat1D)
            ->where('lng','<',$lng1U)
            ->where('lng','>',$lng1D)
            ->get();
        $res = json_encode($data);
        $arr1 = json_decode($res,true);
        $arr = [];
       foreach ($arr1 as $k=>$v){
            $res = $this -> getDistance($lat1,$lng1,$v['lat'],$v['lng']);
            $arr1[$k]['km'] = $res.'km';
            $arr[$k] = $res;
        }
        asort($arr);
        $arr2 = [];
        foreach($arr as $k=>$v){
            $arr2[] = $arr1[$k];
        }
        return $arr2;
    }

以上是通过程序代码来实现的,下面我再附加一条sql语句来实现的,具体哪种比较快,有感兴趣的可以自己测试一下,记得留言哦!!!

SELECT
    id,
    lat,
    lng,
    ROUND(
        6378.138 * 2 * ASIN(
            SQRT(
                POW(
                    SIN(
                        (
                            $lat * PI() / 180 - lat * PI() / 180
                        ) / 2
                    ),
                    2
                ) + COS($lat * PI() / 180) * COS(lat * PI() / 180) * POW(
                    SIN(
                        (
                            $lng * PI() / 180 - lng * PI() / 180
                        ) / 2
                    ),
                    2
                )
            )
        ) * 1000
    ) AS distance
FROM
    image_hunqing_shop
ORDER BY
    distance asc

上代码都经测试,放心使用,有测试不通的留言即可!

2014-04-04 15:14:26 lishuai133 阅读数 1164
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

最近开发微信公众平台,需求是根据用户发送的地理位置信息,将其附近的专家或代售点返回。

算法思路:先算出该点周围的矩形的四个点,然后使用经纬度去直接匹配数据库中的记录。

代码如下:

1、计算四个点的经纬度。

function getAround( $lat, $lon, $raidus)

{
$EARTH_RADIUS = 6378137;
$RAD = $M_PI / 180.0;
$latitude = $lat;
$longitude = $lon;
$degree = (24901*1609)/360.0;
$raidusMile = $raidus;
$dpmLat = 1/$degree;
$data=array();
$radiusLat = round($dpmLat*$raidusMile,6);
$minLat = $latitude – $radiusLat;
$maxLat = (float)$latitude + (float)$radiusLat;
$data["maxLat"]=$maxLat;
$data["minLat"]=$minLat;
$mpdLng = $degree*cos($latitude * ($M_PI/180));
$dpmLng = 1 / $mpdLng;
$radiusLng = round($dpmLng*$raidusMile,6);
$minLng = $longitude – $radiusLng;
$maxLng = (float)$longitude+(float)$radiusLng;
$data["maxLng"]=$maxLng;
$data["minLng"]=$minLng;
return $data;
}

2、计算两点之间的距离。

function rad($dis)
{
$dis=$dis;
return round($dis*(M_PI/180),6);
}

function getDistance($lat1,$lng1,$lat2,$lng2)
{
$lat1=round($lat1,6);
$lng1=round($lng1,6);
$lat2=round($lat2,6);
$lng2=round($lng2,6);
$EARTH_RADIUS = 6378137;
$radLat1 = $this->rad($lat1);
$radLat2 = $this->rad($lat2);
$a = $radLat1-$radLat2;
$b = $this->rad($lng1)-$this->rad($lng2);
$s = 2*asin(sqrt(pow(sin($a/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)));
$s=round($s*$EARTH_RADIUS,0);
return $s;
}

附:查询某地的经纬度http://developer.baidu.com/map/webservice-geocoding.htm

2017-07-23 22:23:03 taomanman 阅读数 500
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

1、获取位置的API


这里是获取到位置,并且打开地图定位到手机当前的经纬度坐标处

wx.getLocation({
  type: 'gcj02', //返回可以用于wx.openLocation的经纬度
  success: function(res) {
    var latitude = res.latitude
    var longitude = res.longitude
    wx.openLocation({
      latitude: latitude,
      longitude: longitude,
      scale: 28
    })
  }
})

2、发起网络请求的API


const requestTask = wx.request({
  url: 'test.php', //仅为示例,并非真实的接口地址
  data: {
     x: '' ,
     y: ''
  },
  header: {
      'content-type': 'application/json'
  },
  success: function(res) {
    console.log(res.data)
  }
})

requestTask.abort() // 取消请求任务


3、根据经纬度坐标获取城市信息的接口地址(百度API):

http://api.map.baidu.com/geocoder/v2/?ak=百度API Key&location=32.12,120.5&output=json


4、根据城市名称获取天气信息的接口地址:

http://wthrcdn.etouch.cn/weather_mini?city=合肥



5、页面js方法调用,在微信API方法内调用另一个方法,要首先获取到当前的页面,如下图所示:

var page = this;


6、获取返回的Json值后,可以在页面中直接.出对应节点的值,如下图所示:

首先创建数组



7、使用模板API,定义与引用




创建模板



8、利用循环获取模板并展示


2019-04-17 17:52:04 baidu_32519511 阅读数 262
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

一、需求(外卖选择收货地址)

       使用小程序的picker组件选择省市区,然后根据选择的省市区获的经纬度来设置map的中心点,  类似于滴滴的选择方式。

二、实现

    首先引入map组件

<map
      id="map"
      scale="14"
      :latitude='!init&&latitude'
      :longitude= '!init&&longitude'
      @regionchange="handleRegionChange"
      @end="handleRegionChange"
      show-location
      :style="'width: 100%; height:'+height+'px'"
    >

   坑一、@regionchange不会触发, 只会触发@end  @begin,  后者不需要所以没有监听。

   坑二、不难看出经纬度的设置多了个参数限制。这是为了解决另一个坑,当用户移动地图之后,重新获取地图中心并设置经纬度,会闪、会闪、会闪。。。重要的bug说三遍,有时甚至会回到原处。

   解决方案、首先map不设置lat,lng能解决切换位置闪的问题,但是就不能初始化地图的中心。所以多设置了一个init参数。初始值为false,然后是handleRegionChange的处理代码

 handleRegionChange (e) {
      this.init = true
      if (e.type === 'end') {
        this.setCenter()
      }
    }

用户移动之后init设置为true,地图中心交map组件自己控制。则不会闪。。。

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