weixin://wxpay/bizpayurl?pr=crf7jti这是什么链接

微信支付开发关键点技术解析
发表于 14:30|
来源《程序员杂志》|
作者方倍工作室
摘要:本文将结合微信支付接口开发的实践,从支付申请到各主要接口的使用方法等方面介绍微信支付的关键点技术。11月15日微信开发者大会(深圳)上招行信用卡服务号、南航服务号/企业号及长安汽车企业号等将分享实战案例。
【编者按】由CSDN和《程序员》杂志联合举办的,在经历了的成功后,应广大微信开发者的强烈要求,主办方将于11月15日在,不仅有、&,还有等众多知名微信开发领域技术专家和典型开发商都将带来精彩演讲(点击)。目前报名处于特惠票价阶段,通过申请加入CSDN CTO俱乐部即可享受(票款中均含豪华午餐),在10月28日之前完成购票和付款流程的同学均将获赠微信技术开发图书一本+北京站讲师演讲视频和讲义(PDF)+全套深圳站讲师讲义(PDF)。微信支付是由微信及财付通联合推出的移动支付创新产品。如今,随着微信支付的全面开放,相关需求也越来越多,很多开发人员进行微信支付开发及商家申请微信支付时,面临着诸多疑惑。本文将结合微信支付接口开发的实践,从支付申请到各主要接口的使用方法等方面介绍微信支付的关键点技术。URL设置目前,微信支付只能由通过微认证的服务号进行申请,订阅号及未认证的服务号均无法申请。登录微信公众平台后台,在左侧的栏目中可找到“微信支付”,点击进入申请界面,可以看到第一项中的“商户基本资料”,点击右侧的“填写”按钮后就进入了微信支付设置界面。微信支付的目录及URL没有固定的设置方法,具体还需要根据自己的需求来定,表1是方倍工作室的方案。表1 微信支付目录及URL设置需要注意的是,如果使用上述方法,要将域名换成自己的域名,其他的结构及层次可不变。这里所有的URL没有填写实际的文件名,目的是为了兼容不同的开发语言或框架。比如目录下的默认文件既可能是index.php,也可能是index.aspx。微信支付申请完成后,便进入了微信支付测试阶段,需要填写支付测试目录,测试目录可以填写为:/wxpay/test/。接口开发JS API支付JS API支付的实现比较简单,官方也提供了Demo,在此基础上修改部分参数即可。修改后的一个示例如下:&?php
include_once("WxPayHelper.php");
$commonUtil = new CommonUtil();
$wxPayHelper = new WxPayHelper();
$wxPayHelper-&setParameter("bank_type", "WX");
$wxPayHelper-&setParameter("body", "微信支付开发教程");
$wxPayHelper-&setParameter("partner", PARTNERID);
$wxPayHelper-&setParameter("out_trade_no", $commonUtil-&create_noncestr());
$wxPayHelper-&setParameter("total_fee", "1");
$wxPayHelper-&setParameter("fee_type", "1");
$wxPayHelper-&setParameter("notify_url",
"/wxpay/notify/");
$wxPayHelper-&setParameter("spbill_create_ip", $_SERVER['REMOTE_ADDR']);
$wxPayHelper-&setParameter("input_charset", "GBK");
$biz_package=$wxPayHelper-&create_biz_package();
?&上述代码中,主要修改了两个参数:notify_url为接收交易通知的路径,这个一定要改为自己服务器上的一个路径;spbill_create_ip为用户客户端的IP,不改关系也不大,不过改一下更规范些。JS API支付是网页内的支付,通过调用微信支付控件来实现支付。如果要用作真实产品场景的支付,只需要修改一下产品名称及费用即可,对于涉及到快递费用的交易,需要注意订单的总金额为商品费用和物流费用的和。如果微信支付时提示Access Denied,通常有以下原因:参数填写不正确、支付目录结构不正确、没有加入白名单权限。需要对照检查一下,才能找到具体原因并进行纠正。Native支付Native(原生)支付就是常说的扫描二维码支付。这种支付首先需要商户定义符合Native支付规范的URL,也就是Native支付URL,同时在微信后台POST商户后台时需要提供package内容。Native支付的开发分为三步。生成Native支付的URLNative支付URL是一系列具有“weixin://wxpay/bizpayurl?”前缀的URL,同时后面紧跟着一系列辨别商户的键值对。原生URL由wxPayHelper类中的create_native_url()方法实现,实现代码如下:&&p&&?php&/p&&p&include_once("WxPayHelper.php");$wxPayHelper = new WxPayHelper();&/p&&p&$productid = "";echo $wxPayHelper-&create_native_url($productid);?&&/p&其中productid是商品唯一ID,开发人员需要定义并维护自己的商品ID,这个ID与一张订单等价,微信后台凭借该ID通过POST商户后台获取交易信息。上述代码生成的URL如下所示:weixin://wxpay/bizpayurl?appid=wxb489e8caeabcdefg&noncestr=BBvdr5atZ9D7s08X&produc
tid=&sign=e15db530e2f2f67ccb5&timestamp=生成URL的二维码有了上述支付链接后,还要把它转成二维码,PHP QR Code是一个开源的二维码生成类库,可使用它来生成上述Native URL,代码如下:&?php
include 'phpqrcode.php';$productid = "";
$filename = $productid.".png";
$nativeurl = "weixin://wxpay/bizpayurl?ap
pid=wxb489e8caeabcdefg&noncestr=BBvdr5atZ9D7s08X&productid=&sign=e15db530e2f2f67ccb5&timestamp=";QRcode::png($nativeurl, $filename, "L", "5", 2);
?&PHP QR Code的使用很简单,配置一下URL和文件名就可以了。执行上述代码,就会在当前目录下生成一个.png的二维码图片文件。Navive支付回调URL在前面说过,Native支付的回调URL设置为/wxpay/native/,当用户扫描上述二维码时,会调用该回调URL。URL需要调用订单信息Package返回给用户,而该Package是由WxPayHelper类的create_native_package()实现,调用代码如下:&?php
include_once("WxPayHelper.php");$commonUtil = new CommonUtil();
$wxPayHelper = new WxPayHelper();
$wxPayHelper-&setParameter("bank_type", "WX");
$wxPayHelper-&setParameter("body", "微信支付开发教程");
$wxPayHelper-&setParameter("partner", PARTNERID);
$wxPayHelper-&setParameter("out_trade_no", $commonUtil-&create_noncestr());
$wxPayHelper-&setParameter("total_fee", "1");
$wxPayHelper-&setParameter("fee_type", "1");
$wxPayHelper-&setParameter("notify_url", "/wxpay/notify/");
$wxPayHelper-&setParameter("spbill_create_ip", $_SERVER['REMOTE_ADDR']);
$wxPayHelper-&setParameter("input_charset", "GBK");
$native_package = $wxPayHelper-&create_native_package();
echo $native_
?&上述代码中,参数的配置和JS API支付一样,只是最后调用的支付方式不一样。与此同时,微信公众平台将会向回调URL推送XML格式的数据。这些数据中包含签名字段,可以用来验证是否是真正的支付二维码,但这个验证的必要性不是很大。而回调URL也会返回一个XML格式的数据给微用户,用户才能看到他所交易的商品信息的内容,这个XML的格式如下:&xml&
&AppId&&![CDATA[wxb489e8caeabcdefg]]&&/AppId&
&Package&&![CDATA[bank_type=WX&body=%E5%BE%AE%E4%BF%A1%E6%94%AF%E4%BB%98%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B&fee_type=1&input_charset=GBK&notify_
u r l = h t t p % 3 A % 2 F % 2 F w w w . d o u c u b e .
com%2Fwxpay%2Fnotify%2F&out_trade_no=RaurRyM00lk9JZ8H&partner=&spbill_create_ip=58.60.3.185&total_fee=1&sign=C580FDA6E31AA89549DEB494]]&&/Package&
&TimeStamp&&/TimeStamp&&NonceStr&&![CDATA[7omKw6AMZOq8022u]]&&/NonceStr&
&RetCode&0&/RetCode&&RetErrMsg&&![CDATA[ok]]&&/RetErrMsg&
&AppSignature&&![CDATA[e01aa37f19aedcd472882]]&&/AppSignature&
&SignMethod&&![CDATA[sha1]]&&/SignMethod&
&/xml&如果商品已过期或有其他错误,则可以在上述返回XML数据中的RetCode和RetErrMsg中体现出来。例如:RetCode为其他非0值,RetErrMsg为“该商品已下架”。交易通知在上述JS API或Native支付完成后,将向/wxpay/notify/发送交易通知,并且带上URL参数,一个完整的带参数URL如下:&a href="/wxpay/notify/index.php?discount=0&fee_type=1&input_charset=GBK&notify_id=xhLwKoKHzIQeMSQrEMJ7WXJNxyPKaUmxsn--xLtq4FT7LkAeFe-IHd_ARlj7kdyYUavoFfz5v2We9P6GEIv7zGgoVlT4gP2I&out_trade_no=omeDreZkCTQOuZSB&partner=&product_fee=1&sign=D18E640BDECB18CDBA88C2&sign_type=MD5&time_end=55&total_fee=1&trade_mode=1&trade_state=0&transaction_id=12012"&
&a href="/wxpay/notify/index.php?discount=0&fee_type=1&input_charset=GBK&notify_id=xhLwKoKHzIQeMSQrEMJ7WXJNxyPKaUmxsn--xLtq4FT7LkAeFe-IHd_ARlj7kdyYUavoFfz5v2We9P6GEIv7zGgoVlT4gP2I&out_trade_no=omeDreZkCTQOuZSB&partner=&product_fee=1&sign=D18E640BDECB18CDBA88C2&sign_type=MD5&time_end=55&total_fee=1&trade_mode=1&trade_state=0&transaction_id=12012&/a"&/wxpay/notify/index.php?discount=0&fee_type=1&input_charset=GBK&notify_id=xhLwKoKHzIQeMSQrEMJ7WXJNxyPKaUmxsn--xLtq4FT7LkAeFe-IHd_ARlj7kdyYUavoFfz5v2We9P6GEIv7zGgoVlT4gP2I&out_trade_no=omeDreZkCTQOuZSB&partner=&product_fee=1&sign=D18E640BDECB18CDBA88C2&sign_type=MD5&time_end=55&total_fee=1&trade_mode=1&trade_state=0&transaction_id=12012&/a&/a&&
&transport_fee=0同时,微信还发送POST数据,XML格式如下:&xml&
&OpenId&&![CDATA[oWWVStzuQl6Gz-pj39_Gk1lvnfoY]]&&/OpenId&
&AppId&&![CDATA[wxb489e8caeabcdefg]]&&/AppId&
&IsSubscribe&1&/IsSubscribe&
&TimeStamp&&/TimeStamp&
&NonceStr&&![CDATA[WW8xQ6th6ybgy0lF]]&&/NonceStr&
&AppSignature&&![CDATA[30ecacd2f6c1caac95727]]&&/AppSignature&
&SignMethod&&![CDATA[sha1]]&&/SignMethod&
&/xml&注意,URL和XML中包含了此次交易的很多重要信息,其中有三项参数,分别是商户订单号out_trade_no,交易号transaction_id及XML数据中的OpenID,这几个参数将在后续很多接口中使用到。订单查询订单查询API的URL为:h t t p s : / / a p i . w e i x i n . q q . c o m / p a y /orderquery?access_token=xxxxxxURL中的参数只包含微信公众平台凭证access_token,而订单查询的真正数据是放在PostData中的,格式如下:{
"appid":"wwwwb4f85f3a797777",
"package":"out_trade_no=11122&partner=&sign=4e8d0df3da0c3d0df38f",
"timestamp":"",
"app_signature":"53cca9d47b883bd4a5c85acb48565c",
"sign_method":"sha1"
}订单查询这一接口,开发文档中并没有给出Demo,所以需要自己来实现。其中关键点是生成参数package中的sign和app_signature。其中,sign是对参数字典序排序并使用“&”联合起来,最后加上&key=partnerkey(唯一分配),进行md5运算,再转成全大写,最终得到sign。而app_signature则是根据支付签名(paySign)生成方法中所讲的签名方式生成,参加签名字段为:appid、appkey、package、timestamp。相关代码实现如下所示:$sign= strtoupper(md5("out_trade_no=JfuKdiBig4zZnE4n&partner=&key=asdfas
dfasdfasdfasdfasdfasdfasdf"));
$package = "out_trade_no=JfuKdiBig4zZnE4n&partner=&sign=".$
$obj['appid'] = "wx0000";
$obj['appkey'] = "8mruTNOGeX8OVUlIYxIyw6kxCRvdJENpWpw8mruTNOGeX8OVUlIYxIyw6kxCRvd
JENpWpw8mruTNOGeX8OVUlIYxIyw6kxCRvdJENpWpw8mruTNOGeX8OVUlIYxIyw6k";
$obj['package'] = $
$obj['timestamp'] = time();
$WxPayHelper = new WxPayHelper();//get_biz_sign函数为protected类型,可改为public
$app_signature = $WxPayHelper-&get_biz_sign($obj);发货通知发货通知API的URL为:h t t p s : / / a p i . w e i x i n . q q . c o m / p a y /delivernotify?access_token=xxxxxxURL中的参数只包含微信公众平台凭证access_token,而发货通知的真正数据放在PostData中,格式如下:{
"appid":"wwwwb4f85f3a797777","openid":"oX99MDgNcgwnz3zFN3DNmo8uwa-w",
"transid":"333",
"out_trade_no":"555666uuu",
"deliver_timestamp":"",
"deliver_status":"1",
"deliver_msg":"ok",
"app_signature":"53cca9d47b883bd4a5c8
&span style="font-family: Helvetica, Tahoma, Arial, sans- font-size: 14"&5acb48565c",&/span&&p&&"sign_method":"sha1"
}&/p&发货通知也没有Demo,需要自己开发实现,其中的关键点也是生成app_signature,它根据支付签名(paySign)生成方法中所讲的签名方式生成,参加签名字段为:appid、appkey、openid、transid、out_trade_no、deliver_timestamp、deliver_status、deliver_msg。实现代码如下所示:$deliver_timestamp = time();
$obj['appid'] = APPID;
$obj['appkey'] = APPKEY;
$obj['openid'] = "oWWVStzuQl6Gz-pj39_Gk1lvnfoY"; //交易通
知XML中获得$obj['transid'] = "5725"; //jsapi中生成,交易通
知URL中获得$obj['out_trade_no'] = "omeDreZkCTQOuZSB"; //jsapi中生成,交易通
知URL中获得$obj['deliver_timestamp'] = $deliver_
$obj['deliver_status'] = "1";
$obj['deliver_msg'] = "ok";
$WxPayHelper = new WxPayHelper();
$app_signature = $WxPayHelper-&get_biz_
sign($obj);告警通知告警通知的URL为申请微信支付时设置的/wxpay/alarm/,微信后台将向该URL推送包含PostData的XML数据,数据中包含错误类型、错误描述、错误详情等信息。告警数据在接收后需要写入到系统告警模块中,并要求商户尽快做出处理,以免影响线上经营。维权通知维权通知的URL为申请微信支付时设置的/wxpay/rights/,用户在新增投诉单及确认处理完毕投诉后,微信后台都会向该URL推送包含PostData的XML数据, 数据中包含维权内容信息。维权通知是被动接收到的通知,接收到后,最好能使用模版消息提醒自己,以免错过处理时限。标记投诉处理标记客户投诉处理状态API的URL为:https://api./payfeedback/update?access_token=xxxxx&openid=XXXX&feedbackid=xxxxURL中的参数包含微信公众平台凭证access_token,客户投诉对应的单号feedbackid,以及OpenID。填好参数后访问该URL即可返回“标记成功”的通知。收货地址共享收货地址共享的开发是微信支付开发中最复杂的部分,主要原因有:官方没有Demo;开发文档含糊不清;签名算法与之前的不一致,需要自己新实现;JS API回调后不能给出错误原因提示,调试没有方向感,需要开发者对高级接口中的OAuth2.0过程非常精通。收货地址共享的完整实现步骤如下。设置授权回调域名OAuth2.0授权页面域名的配置在公众平台网站→开发者中心→接口权限表→高级接口→OAuth2.0网页授权中设置,将域名设置成微信支付授权目录中的域名,如。构造请求授权回调URL请求OAuth2.0授权的URL如下:请求授权参数说明如表2所示。表2 请求授权参数这里,构造请求接口如下:其中,/wxpay/getAddress.php是获取共享收获地址的页面。作用域使用snsapi_base,用户访问上述请求接口之后,将会跳转到页面/wxpay/getAddress.php?code=02feabc395c1b2e0451547&state=1。获取共享收货地址在getAddress.php页面,首先需要获取授权Access Token,这个Access Token是OAuth2.0授权时获得的,不是自定义菜单实现时的那个Access Toekn。实现代码如下:$appid = APPID;
$appsecret = APPSERCERT;
$code = $_GET["code"];
$access_token_url = "https://api.weixin.
qq.com/sns/oauth2/access_token?appid=$ap
pid&secret=$appsecret&code=$code&grant_
type=authorization_code";
$access_token_json = file_get_
contents($access_token_url);
$ a c c e s s _ t o k e n _ a r r a y = j s o n _
decode($access_token_json, true);
$access_token = $access_token_
array['access_token'];然后需要计算出地址签名,参与addrSign签名的字段包括:appid、url(当前网页URL,包含code和state参数)、timestamp、noncestr、accessToken(用户OAuth2.0授权凭证)。这里scope、signType不参与签名。这是共享收获地址中最关键的一步,它对所有待签名参数按照字段名ASCII码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2……)拼接成字符串string1。然后对string1作签名算法,字段名和字段值都采用原始值,并进行URL转义。具体签名算法为addrSign = SHA1(string1)。其代码如下:$commonUtil = new CommonUtil();
$noncestr = $commonUtil-&create_noncestr();
$timestamp = time();
$url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$wxPayHelper = new WxPayHelper();
$obj['appId'] = $
$obj['url'] = $
$obj['timestamp'] = $
$obj['noncestr'] = $
$obj['accessToken'] = $access_//参数小写
foreach ($obj as $k =& $v){ $obj2[strtolower($k)] = $v; }//字典序排序
ksort($obj2);//URL键值对拼成字符串
$ b i z S t r i n g = $ c o m m o n U t i l -&formatBizQueryParaMap($obj2, false);//sha1签名
$signature = sha1($bizString);所有字段的值都获取成功以后,就赋值成收货地址接口的JS API中的变量值。其他接口其他接口还有退款接口、退款查询接口、对账单下载等,他们都有Demo,配置好后即可使用。其中唯一要注意的就是退款接口的开发中pem证书的生成方法。在退款接口的开发中,需要把pfx证书转换pem证书,转换后将pem文件作为私钥。这需要用到OpenSSL这一工具,一般Linux已自带该功能。在Linux下的转换命令如下:[root@FANGBEI wxpay]# openssl pkcs12 -in .pfx -out .pem
Enter Import Password:MAC verified OK
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
[root@FANGBEI wxpay]# lltotal 8-rw-r--r-- 1 root root 4011 Aug 14 15:31 .pem-rw-r--r-- 1 root root 2717 Aug 14 15:28 .pfx
[root@FANGBEI wxpay]#转换过程中需要输入商户ID来解密旧证书,然后设置新密码来加密新证书,新密码将在退款程序中配置使用。总结微信支付的开发文档中对部分关键技术阐述不详,不利于开发者快速理解上手。本文从申请微信支付时目录及URL设置到各种接口开发中的核心部分都做了讲解,希望能为微信支付的开发人员提供帮助,加快开发速度。请关注的持续更新如果您不想错过与他们的交流机会,请点击,3人以上团购可享受优惠价。主办方还特别开通了微信开发者QQ群:,欢迎加入交流。
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章为何用二维码扫描App扫描微信名片都能直接跳转到微信?这是如何实现的?
微信二维码名片的信息就是一个http的连接,但用非微信的二维码App扫描,访问这个链接都能直接跳转到微信,这是如何实现的?在没有安装微信的情况下,点击这个链接,会跳转到微信app的下载地址。
按投票排序
开头补充下题注这个问题:目前是实现不了,微信已经封掉了相关办法。以前根据URL Scheme可以做到任何地方跳转到某个联系人,比如网页中只需插入下面链接就行:&a href="weixin://qr/QeD64j-EGGJnrXuB97VT"&点击此处关注我&/a&
-------------------------------------------------下面是二维码相关技巧直接上干货:注:本文有一些二维码干货,希望对二维码不是非常熟悉的产品/开发能有所收获。注2:查看本文前,请先确保你手机里有足够可扫描二维码的App(微信/微博/QQ/浏览器/淘宝/支付宝/我查查/豌豆荚/360……)二维码,业界当然是人人听说,人人用过。这个话题,我倒是百感交集,我一直认为,我有一种“二维码情节”。一方面, 我自认为是国内“钻研”二维码比较早的一个人了,大学时也自己业余开发了一款Android App,主要做条形码比价和二维码扫描。而在后来的工作中,依旧会接触到二维码的利用,让我打开了更多的思路;另一方面,二维码的高度灵活,导致每个人、每个产品对它的理解都不一样。一直以来,国内公司更是在这方面不论是产品功能,还是互动营销上,都做得实在太粗糙。所以很难找到一个完美的方法,来把二维码真正的能力诠释出来。这篇文章,我试着从原理、实践以及进阶技巧三个方面,来讲讲二维码可能对任意互联网产品带来的益处。若能真正对哪怕一个用户带来便利,我也倍感荣幸。一、二维码本质是什么?如果你对这个问题了如指掌,那么请直接跳过。否则(尤其是非技术出身的产品经理)就一定要先知道,二维码到底是个什么东西?一个普通的二维码二维码(dimensional barcode,大家习惯称QR Code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。简单粗暴的解释就是:二维码它就是把一段纯文本用图形样式转换出来了,以便于快速扫描读出。这样做的原因在于,如果我有一堆比较凌乱的文本(比如一个很长的URL、一些加密后的字符串、或者一个复杂的快递编号),想把他们快速输入电脑/手机里的话,靠人肉是非常痛苦而容易出错的。但经过二维码巧妙的编码后,就能用低廉的扫描枪,或者普通的手机摄像头快速扫描录入,大大节省了时间;而且转换成编码后,哪怕任意一个字母,也不可能出现识别错误。二、现有产品都是如何利用二维码的?我这里举几个最普遍的例子:1. H5官网、App下载地址。这个真的不必介绍太多,就是直接把网站或App的URL,直接生成二维码,然后搬到WEB上或者线下进行推广。2. 微信。二维码的推动,在国内最大的功臣就是微信,这也得益于各种电梯外卖传单广告会显眼标注的“微信扫一扫”。我们来看看微信的二维码长啥样:牛冰峰的微信二维码这个 ……二维码呐,它看起来都是这样对吧?但前面说过,“二维码它就是把一段纯文本用图形样式转换出来了”,所以我们随便找些工具扫描下(例如),上面的二维码对应的文本其实是这样的:/r/QeD64j-EGGJnrXuB97VT
没错,微信名片的二维码,对应的是一个特殊的URL,仔细看应该能猜到:后面“QeD64j-EGGJnrXuB97VT”这部分内容,就是包含了一个用户ID的信息(并且是经过加密的)。微信在扫描到“”开头的二维码时,就把后面“QeD64j-EGGJnrXuB97VT”部分解析,搜到这个用户。(至于为什么后面部分要加密,你猜咯?)3. 微博。了解了微信,再来看看微博二维码:@牛冰峰 的微博二维码直接看二维码内容:/qr/userinfo?uid=
这个更好理解了吧?最后的UID就是微博用户的ID了。客户端扫描到“”开头信息,就抓取后面UID,并把该用户主页展示给扫描者。(对了,相比微信,微博二维码里UID又是公开的,又是为什么呢?)好了,我们常见二维码也可以说是两类,一类是一个单纯的URL,扫描就打开网页,或者直接下载APP;另一类是“设计过的”URL,只有用对应的APP扫描,才能跳转到正确的界面。对于第二类二维码,除了微博微信,也还有很多。但他们在流程上几乎是一个原理:扫描内容 --& 解析后匹配是否有固定部分 --& 获取动态部分 --& 跳转到对应界面。三、二维码进阶:User Agent(UA)的利用现在我们做个实验,还是刚刚的微信二维码:牛冰峰的微信二维码我们也知道,它对应的文本信息(也算是个URL)为:/r/QeD64j-EGGJnrXuB97VT。
接下来,请你依次(尽可能)完成下面的操作:1. 使用微信客户端扫描上面二维码,是什么结果?2. 使用Android微博(或者UC/百度浏览器/我查查)扫描上面二维码,什么结果?3. 使用iPhone微博(或者UC/百度浏览器/我查查)扫描上面二维码,什么结果?4. 在电脑上打开,什么结果?5. 找一部非主流系统(例如Firefox、Ubuntu)手机扫描上面二维码,什么结果?不管你是否尝试了,我先来说下结果:1. 直接扫描到我的账号了,可以添加到通讯录2. 直接跳转浏览器开始下载微信.apk安装包了3. 直接弹出Appstore微信应用了4. 地址栏很快跳转了下,然后转到微信官网了5. 打开微信WAP官网了So……明明是同一个URL啊,为毛它呈现出了5种截然不同的结果给我?其实这里是微信利用User Agent信息,给你呈现了不同的结果而已。User Agent简称UA,简而言之,就是你访问任何网站时,网站可通过你的UA得知你使用的操作系统、浏览器、浏览器内核等信息。这个信息最终是由你的浏览器传递给对方网站的(所以严格来讲你是可以修改的,看看你手机上第三方浏览器设置里的UA选项)。上面的5个例子,除了第1个原理前面讲到了,后面4个,都是根据用户UA,判断是4个平台的用户,所以给他们各自跳转到了对应的地址,提供准确的服务(具体如何实现?那你得找开发蝈蝈了~反正你就跟他说我要这个功能呗)。掌握了这个小知识,你就可以很灵活地针对潜在扫描用户做出不同对待了。最低级的利用是,我不希望以后还能看到这种下载宣传了:很多很多产品在宣传时使用过两张二维码上图这种奇葩形态,刨除技术因素“不懂”外,产品上也是反人类的:现在手机像素高、速度极快,很多时候扫描二维码还没等你对准就已经完成了。这种情况下,用户很有可能就“被”扫描到隔壁的一个了,那还下载个毛啊?四、二维码利刃:URL参数组合又牵扯到另一个大话题了,先看下面两个链接,还是微博二维码格式:/qr/userinfo?uid=
/qr/userinfo?uid=
分别点开,明显就是两个用户的微博主页。这时候你很容易想到:我把后面的uid=xxx随便替换,就可以查看不同的用户主页了吧?没错。这里在一个URL中跟在“?”后面的类似“uid=”的东西,就叫参数。我们在浏览器访问的过程,实际上是浏览器找到了这个服务窗口,给它说:“嘿,接口同志!我取个信息,uid是。”userinfo这个服务窗口根据从海量数据里查到了uid=的信息,返回给浏览器。浏览器最后把整个信息展示给了用户。继续举个例子,假如有这样一个URL:/register?name=bingfeng&sex=male&age=24
这里register是注册的意思。在浏览器打开这个URL,过程就可以描述为:浏览器找到了这个注册专用服务台,给它说:“嘿,接口同志!我存个信息,它的名字是bingfeng,并且性别是男,哦对了,年龄是24岁。”register注册专用服务台拿走了这些信息,全部记录了下来,说“存好了你走吧”,浏览器回来给用户说:“存好了。”上面讲了这么一大堆,就是为了说明一个原理:一旦涉及到动态产生大量二维码,就一定会用到URL参数。同一个参数值是不重复的,代表了特定的节点(某个用户、某篇文章等)。而产品就是通过扫描二维码后提取对应参数来实现查找的。例如微信二维码它的参数就是QeD64j-EGGJnrXuB97VT,只是看起来和“?”不太一样而已。二维码参数实例一:APP下载URL+设备ID参数这是我2年前在新浪做的第一个产品,也是新浪首次试水硬件/物联网的产品:,主要功能是通过App随时随地查看家里室内外的气象数据。在使用之前,用户必须要用微博账号绑定买到的这台设备,而绑定的过程,毫无疑问需要用到二维码。那么问题来了:1. 用户首先需要安装“新浪气象站”APP;2. 一般人看到二维码的第一反应是:先用微信扫扫看;3. 我需要用户使用“新浪气象站”来扫描这个二维码完成绑定。如何解决上面的问题呢?我们做了下面的二维码,并且印刷在了设备上:你可以扫描下载此应用试试这个二维码对应的文本是:/weatherstation/web/down?deviceid=AC000W
接下来,你分别用iPhone、Android和电脑浏览器打开看看,是否和微信一样,直接下载App了呢?因为这个URL本来就是根据用户UA,返回了不同的下载地址。当用户安装打开气象站APP以后,会提示扫描该二维码,此时其必然使用气象站内的扫描功能,而这时我们将扫描到的内容解析,只提取“deviceid=AC000W”这个参数,成功完成了绑定。二维码参数实例二:一个二维码,支持多个APP扫描使用这个描述不够清楚,产品需求其实是:微博与厂商合作推出的智能空调,其首次使用依旧需要扫描二维码绑定。但该空调特色是,既支持微博私信控制,又支持独立APP操作。当然,微博和APP的二维码扫描也都要支持。这种情况下有一个最大的限制:微博二维码,它的形式是死的,就只能是这样,否则微博客户端压根就不会处理。但在这个URL里,参数uid它只是对应的微博号,而如果我们空调APP要扫描,拿到了微博号是没用的,必须拿到设备号。于是,我们突发奇想,直接在原URL后又加了个参数deviceID:/qr/userinfo?uid=&deviceID=ABCD987456
这里的deviceID=ABCD987456,我们称为无效参数。由于微博压根就不需要这个参数,所以当向微博请求时,它认为这个没用直接忽略掉。但是在我们独立APP里,就可以专门去提取deviceID这个参数,从而得到自己最需要的信息。这样,利用添加无效URL参数,实现了一个二维码为N个互不相同的客户端服务的目的。五、二维码FAQ:Q:二维码一定都是URL内容吗?A:当然不是。但在实际应用中,由于人们习惯用微信和浏览器扫描,URL是最自然的形态。并且很多二维码是为了推广APP,URL一扫就下,最方便不过了。Q:我想在微信里也能实现扫描二维码后下载我的App(而不是被屏蔽),有办法吗?A:有!你去找一找鲜城,看看怎么做的。Q:二维码可能传播恶意病毒吗?A:这是个被央视报道过很多次的话题,但可惜央视每次都是断章取义含糊其辞。二维码本质是字符串,所以唯一的可能就是这个字符串对应了一个Android平台的恶意程序,用户扫描后不做判断,直接安装并打开了这个应用,并且丝毫没察觉该应用与自己期望不一致。这就和过去几年淘宝购物时,随便点击来路不明的链接网银付款一个道理,你说二维码冤枉不?Q:二维码防伪是什么?A:理解成把过去防伪查询需要手动输入的串号,现在改自动输入。千万别因为很多产品印刷个小小的二维码就觉得“是正品”了。Q:二维码都这么丑?A:二维码算法具有一定兼容性,黑白块是最容易识别的,但其实完全可以做很多美化的。这在企业宣传设计上应该有很大的意义。参考Q:为什么作者@牛冰峰 有“二维码情节”?A:因为曾经看不下去国内对二维码的低效应用,一直想做一些事,可是一直没有真正行动起来。作者: · 90后 · 3年产品 · 目前PM · 水货 · Android骨灰粉 · 欢迎交流
看了前面的答案,觉得答的都似是而非。首先,微信的二维码内容是一个网址,地地道道的网站,并不是上面@耿健桓提到的什么Scheme(如果单单是Scheme,楼主也估计没必要问这个问题了),不过整个交互流程是有用到Scheme的技术的,下面流程会说。到这一步,我们已经可以撇开二维码扫描工具干扰。问题归为:通过一个网址,如何优先打开一个App,次优先打开一个下载地址。整个流程大致可以分为以下步骤1.(在safari里)输入网址(二维码的核心作用就是让摄像头输入网址,再调用safari打开网址,二维码扫描工具用的就是webkit之类的沙盒模式下的Safari啦)。2.服务器解析网址解析的大致过程是这样的,-&首先判断链接访问的设备,这里假设判断的是safari,ios 设备。(根据useagent判断就可以得出)。-&判断出是ios设备后,链接的后台通过js之类的打开 微信自己定义的Scheme URL。这个时候,如果设备上安装了微信app,系统就是根据Scheme 协议启动微信App,如果设备上没有按转微信App,通过js打开的url(Scheme URL) 会返回一个undifined的类型。(这里ios系统有一点点用户体验上的不友好,,,,)这个时候,js再次请求微信Appstore下载的地址,从而打开AppStore上的下载地址。.. 说了这么多,现在有一个机会可以马上看一下效果,而不要知道具体如何实现,你就可以大概猜出怎么实现的。--日更新例子 ps:虽然不是很了解Andrid的机制,但机理应该差不多。如果友好一点的话只要把Scheme URL 换成AndridScheme URL就可以啦??Andrid技术参考这里:-------pps: 评论里说的也一并放上来,算是完善答案。Android上的应用可以直接关联url,比如打开就会出现选择是用知乎客户端打开还是用浏览器打开(可以记住选择)
在 iOS 上是用 scheme 机制实现的,每个 App 都可以在 Info.plist 里声明自己支持的 scheme(但是诸如 HTTP 等 scheme 声明了也是无效的),比如知乎 iPhone 的 scheme 是 "zhihu:"。然后向第三方公开这些 scheme,那么跳出方的应用就可以判断是否存在待响应的应用并打开,或者不存在则打开应用下载 URL。
微信扫描二维码常见的几种结果,***为对应的参数1.http(s)://www.***.com
http链接2.weixin://qr/××× 微信二维码3.××× 微信二维码名片4.×××
网页登陆二维码5.×××
国际部网页登陆二维码6.weixin://wxpay/bizpayurl/×××
微信支付7.××× 微信群二维码第2和3种名片二维码结果,参数比如为 MJROVkjEHQVirRw298Ei,微信然后会搜寻 MJROVkjEHQVirRw298Ei@qr用户,根据结果就可以加名片上的好友/公众号了
最近有一种微信防伪技术,通俗讲就是运用微信二维码手机扫描溯源,可以明确追溯产品编号出厂日期运货渠道,保证产品质量谨防假冒。1、微信是目前最流行的APP,手机不需要另外安装软件,微信公众账号经过微信严格审核,可信度高。
2、微信防伪信息平台让每一件商品都拥有唯一的、加密的二维码,该二维码不仅是每件商品的身份标识,同时也是一种能被普通智能手机识读的数据格式,结合手
机应用、网络平台与后台服务,能够达到产品质量追溯和防伪的功能,同时还可以从每一件商品追溯到每批,然后每批的各个环节,以及通过扫描防伪标签上的二维
码能查到商品的原辅材料、产地、上级批发商和下端零售商,二维码中还可以查询产品和品牌的信息,实现商品从生产、
批发、零售、消费全过程可追溯管理,是消费者了解商品安全来龙去脉的“窗口”;微信防伪信息平台采用大数据平台,能够更好的掌握和分析消费者的购买习惯,
为企业与消费者之间互动带来更好的体验。
3、微信防伪信息平台采用云端信息集成技术,可全方位追溯产品的基础信息、生产信息、检测信息、流通信息、包装信息等,结合后台的校验机制,具有传统防伪
无法比拟的严密性和灵活性;从而排解消费者对商品安全的担忧,增强消费者购物体验以及对商品的信赖度和忠诚度,提高二次购买量。
4、微信防伪信息平台借助现代信息、基于互联网的二维码技术,全方位、深层次、立体化解决商品防伪溯源的核心问题,让每一件产品都拥有自己的身份证,让消
费者能够在购买商品的时候识别每一件商品的真伪,以及了解相关企业的信息和获得更多真品的购买渠道,同时也为消费者、企业和政府部门把控产品原材料、打击
假冒伪劣产品和追溯产品流向提供了强有力的“武器”。
如果想了解更多的关于相关内容,欢迎联系我们,24小时咨询热线:
不管是想通过扫描二维码查看微信名片/进入一个微信群,经检验和推论是不行的。所有微信自己生成的二维码url都会带有的前缀,微信禁用了其他app(包括微信自家的浏览器/qq浏览器)跳转到该url。所以,目前是不能实现的。=(
楼上给出的报文是用二维码扫描软件后用浏览器打开链接时的报文; 抓取了微信扫一扫的报文,只能看出来扫描后打开微信号页面的头像图片加载报文。
step 1:&!DOCTYPE html&&html& &head&
&meta http-equiv="content-type" content="text/charset=gb2312"/& &/head& &body&
window.location = "weixin://qr/Eb1xaaTEFflqreAK9_gD";
setTimeout( function(){
if(navigator.language == "zh-CN" || navigator.userLanguage == "zh-CN"){
window.location="";
window.location = "";
} , 1500);
&/script& &/body&&/html&如果装了微信的话weixin://qr/Eb1xaaTEFflqreAK9_gD可以打开,否则跳转到market,这得根据agent决定是android还是ios marketstep2:&html&&head& &meta http-equiv="refresh" content="0; url=/cgi-bin/download302?&url=ios&cl=mobile"&&/head&&body&&/body&&/html&step 3:;url=ios&cl=mobile返回302=&
我曾经用java画过二维码,简单来说,就是把一串URL信息给图形化了,比如 ,,给图形化成一个二维码,微信扫描的时候,发现是URL,就用内置的webView打开了。
没错,微信名片的二维码,对应的是一个特殊的URL,仔细看应该能猜到:后面“QeD64j-EGGJnrXuB97VT”这部分内容,就是包含了一个用户ID的信息(并且是经过加密的)。 这个加密方式是啥
已有帐号?
无法登录?
社交帐号登录

我要回帖

 

随机推荐