微信开发 扫码 苹果

2019-09-02 16:37:01 Zllvincent 阅读数 9203

一.微信已发展成一个庞大的生态系统,是生活、社交不可缺少的优秀产品。ios 开发中时常需要调用相关微信功能,扫码二维码等

1.info.plist 添加白名单 ***LSApplicationQueriesSchemes***,如下图

在这里插入图片描述

2.代码实现

if let tmpurl = URL(string: "weixin://scanqrcode"){
            
            //跳转扫一扫
            if UIApplication.shared.canOpenURL(tmpurl) {
                UIApplication.shared.open(tmpurl, options: [UIApplication.OpenExternalURLOptionsKey(rawValue: "weixin://scanqrcode"):"weixin://scanqrcode"]) { (result) in
                    
                }
            }
            else{
                SwiftProgressHUD.showFail("请先安装微信App")
            }
    }
2017-10-09 17:29:22 yanzi920403 阅读数 22105

根据微信api,整理了一下调用微信扫一扫功能。如有问题请指正:

以下是具体步骤:

  1. 1、绑定域名(很关键
  2. 2、引入JS文件(很简单)<scriptsrc="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"></script>
  3. 3、通过config接口注入权限验证配置(很重要
  4. 4、通过ready接口处理成功验证(还没用到)
  5. 5、通过error接口处理失败验证(还没用到)
绑定域名(第一步):


以下是通过config接口注入权限验证配置(第三步):

下面是js代码:

$.ajax({
            type : "post",
            url : "/weixin/open/weixinOAuthCallback_sign.action",
            data : {
                "url" : location.href.split('#')[0]
            },
            dataType : "json",
            success : function(data) {
                wx.config({ 
                    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。   
                    appId: data.appId, // 必填,公众号的唯一标识
                    timestamp: data.timestamp, // 必填,生成签名的时间戳
                    nonceStr: data.nonceStr, // 必填,生成签名的随机串
                    signature: data.signature,// 必填,签名,见附录1
                    jsApiList: [
                                  'checkJsApi',
                                  'startRecord',
                                  'stopRecord',
                                  'translateVoice',
                                  'scanQRCode',// 微信扫一扫接口
                                  'openCard'
                               ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 
                }); 
                wx.error(function(res) {
                    alert("出错了:" + res.errMsg);//这个地方的好处就是wx.config配置错误,会弹出窗口哪里错误,然后根据微信文档查询即可。
                });

                wx.ready(function() {
                    wx.checkJsApi({
                         jsApiList : ['scanQRCode'],
                         success : function(res) {

                         }
                    });
                });
                //点击按钮扫描二维码
                $("#scanQRCode").click(function(){
                    wx.scanQRCode({
                        needResult : 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
                        scanType : [ "qrCode"], // 可以指定扫二维码还是一维码,默认二者都有
                        success : function(res) {
                            var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
                            window.location.href = result;//因为我这边是扫描后有个链接,然后跳转到该页面
                        },
                        error : function(){
                            console.log('123');
                        }
                    });
                });
            }
        });

下面是后台java代码,用于获取sign签名AppID:微信公众号应用的唯一标识,AppSecret微信公众号的私匙(相当于密码)

/**
       * 得到jsApi-ticket
       * @return
       */
      @SuppressWarnings({ "static-access", "unused" })
      private String getJsapiTicket(){
            HttpServletRequest request = ServletActionContext.getRequest();
            String code = request.getParameter("code");
        String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?"; 
        String params = "grant_type=client_credential&appid=" + APPID + "&secret=" + APP_SECRET + ""; 
        String result = this.httpGet(requestUrl+params); 
        String accessToken = com.alibaba.fastjson.JSONObject.parseObject(result).getString("access_token"); 
       
        requestUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?"; 
        params = "access_token=" + accessToken + "&type=jsapi"; 
        result = this.httpGet(requestUrl+params); 
        String jsapi_ticket = com.alibaba.fastjson.JSONObject.parseObject(result).getString("ticket"); 
        return jsapi_ticket;
    }
      /**
       * 获取sign签名
       * @return
       */
      public String sign() {
            HttpServletRequest request = ServletActionContext.getRequest();
        Map ret = new HashMap();
        String url = request.getParameter("url");
        String jsapi_ticket= getJsapiTicket();
        String nonce_str = create_nonce_str();
        String timestamp = create_timestamp();
        String string1;
        String signature = "";
        int length=url.indexOf("#");
            String uri = url;
            if(length > 0){
                  uri=url.substring(0,length);//当前网页的URL,不包含#及其后面部分
            }
        //注意这里参数名必须全部小写,且必须有序
        string1 = "jsapi_ticket=" + jsapi_ticket +
                  "&noncestr=" + nonce_str +
                  "×tamp=" + timestamp +
                  "&url=" + url;
        System.out.println(string1);
        try
        {
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
            crypt.reset();
            crypt.update(string1.getBytes("UTF-8"));
            signature = byteToHex(crypt.digest());
        }
        catch (NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
        ret.put("appId", APPID);
        ret.put("url", uri);
        ret.put("jsapi_ticket", jsapi_ticket);
        ret.put("nonceStr", nonce_str);
        ret.put("timestamp", timestamp);
        ret.put("signature", signature);
        System.out.println(signature);
        this.setJsonString(JsonUtil.toJSONString(ret));
        return "json";
    }
    private static String byteToHex(final byte[] hash) {
        Formatter formatter = new Formatter();
        for (byte b : hash)
        {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }
    private static String create_nonce_str() {
        return UUID.randomUUID().toString();
    }
    private static String create_timestamp() {
        return Long.toString(System.currentTimeMillis() / 1000);
    }
      /**
     * 发送get请求
     * @param url    路径
     * @return
     */ 
    public static String httpGet(String url){ 
        //get请求返回结果 
         String strResult = null; 
        try { 
            DefaultHttpClient client = new DefaultHttpClient(); 
            //发送get请求 
            HttpGet request = new HttpGet(url); 
            HttpResponse response = client.execute(request); 
  
            /**请求发送成功,并得到响应**/ 
            if (response.getStatusLine().getStatusCode() == org.apache.http.HttpStatus.SC_OK) { 
                /**读取服务器返回过来的json字符串数据**/ 
                  strResult = EntityUtils.toString(response.getEntity()); 
            } else { 
                logger.error("get请求提交失败:" + url); 
            } 
        } catch (IOException e) { 
            logger.error("get请求提交失败:" + url, e); 
        } 
        return strResult; 
    }

2017-07-28 16:14:28 Longyu144714 阅读数 5415

最近忙于工作,没有写博客,再做上个项目的时候遇到ios系统,苹果手机在微信公众号中调用微信扫码的时候失败了,其个中原因听下面细细道来

先来说说微信公众号web开发调用微信扫码,先要验证,然后再调用(首先要引入jweixin.js),其代码如下:

var url = "";
var req = {
    AppType:"XX",
    RequestUrl:window.location.href.split('#')[0]       
};  
this.$http.get(url,{params:req}).then(response =>{
    wx.config({
    debug:false, //开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打开,仅在pc端时才会打印。  
    appId: response.data.AppId, // 必填,公众号的唯一标识
    timestamp: response.data.TimeStamp, // 必填,生成签名的时间戳
    nonceStr: response.data.NonceStr, //必填,生成签名的随机串
    signature: response.data.Sign, // 必填,签名
    jsApiList: jsApiList // 必填,需要使用的JS接口列表,所用的JS接口列表见官方文档   
    });
})  

上面为初始化代码,接下来是调用代码:

wx.ready(function(){
    wx.scanQRCode({
        needResult:1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果  
        scanType:["barCode"], // 可以指定扫二维码还是一维码,默认二者都有
        success: function(res){
            var result = res.resultStr; // 当needResult 为1时,扫码返回的结果
            /*此处写对结果的处理*/           
        }   
    })  
})

上面的整个过程就是初始化及调用扫码,其中在初始化的时候,url,req的参数是自己所定义的,上面的仅供参考,在这个过程中一定要注意req的属性 RequestUrl,平常的获取URL中的服务器地址对于ios系统来说会验证失败的,例如使用

window.location.origin

这段代码获取在ios系统中会失败,必须用字符串截取方式,截取到固定的服务器地址,此问题困扰了我两天,只能这样解决!

2020-03-24 17:49:55 Swn__ 阅读数 197

第一步

微信开发平台登录进去之后再管理中心——>创建网站应用。填上网站应用的基本信息之后提交审核。审核通过后会有AppID和secret。做好保存。

注:这里的回调域名很重要,请填XXX.XXX.XXX格式。并尽量填写互联网上的域名,测试域名如果没报错也可以用。

第二步

在需要扫码登录的页面添加下面代码


<!-- 放置二维码的div -->
<div id="login_container"></div>

<script type="text/javascript" src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>

var obj = new WxLogin({
		self_redirect: false,
		id: "login_container",
		appid: "从开放平台获取的AppID",
		scope: "snsapi_login",
		redirect_uri: encodeURIComponent("填写登录成功后你要跳转的页面"),
		state: "回调参数可随意填",
		style: "",
		href:""
	});
	

如果需要修改二维码的样式,步骤如下:
1、对css代码base64加密
在这里插入图片描述
在这里插入图片描述
2、href参数格式:href: "data:text/css;base64,base64加密后的字符串

href:"data:text/css;base64,LmltcG93ZXJCb3ggLnFyY29kZSB7d2lkdGg6IDIwMHB4O30KLmltcG93ZXJCb3ggLnRpdGxlIHtkaXNwbGF5OiBub25lO30KLmltcG93ZXJCb3ggLmluZm8ge3dpZHRoOiAyMDBweDt9Ci5zdGF0dXNfaWNvbiB7ZGlzcGxheTogbm9uZX0KLmltcG93ZXJCb3ggLnN0YXR1cyB7dGV4dC1hbGlnbjogY2VudGVyO30gCi5pbXBvd2VyQm94IC5zdGF0dXN7cGFkZGluZzogMH0="

注:跳转的URL页面中的域名要和开放平台填的域名相同,开放平台的域名审核通过之后可以修改。顶级域名相同不起作用,只有二级域名相同才可以,也就是 www.example.com 要相同,而不是example.com相同,如果有人用顶级域名成功获取的话,请分享一下!

第三步

用户扫了上述二维码之后,点击登录按钮后,页面会跳转到redirect_uri填写的内容中,并带上code和state参数。通过code获取access_token。
获取URL:https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
这一步最好放在服务器端执行,以保证secret的保密性。前端要是调用的话,会有跨域问题、打印错误问题。反正我只遇到这种问题的。
返回的数据有
在这里插入图片描述
我目前的业务只需要到这一步就可以了。以后拓展了的话再更新。

2017-12-26 12:12:25 paymm 阅读数 1500

 

做了京东,支付宝和微信的python版本支付,发现只有微信支付开发文档是最用心去做的,讲解的非常仔细,还有大量的伪代码,说实话,实现起来真是没有难度,只是前期准备的东西有很多,比如要申请各种认证,至少到目前为止,我没有发现诸如京东支付或者支付宝支付那样的测试环境供普通开发者去调试

技术描点

微信支付方式非常多,详见:https://pay.weixin.qq.com/wiki/doc/api/index.html。

我在这里是用的扫码支付,用于pc网站。首先要准备的是两个重要的帐号:公众帐号ID和商户号。所以要先去以公司的名义申请商户资质

各种申请好了之后,找到【公众帐号ID】和【商户号】就可行,【公众帐号ID】藏的比较隐秘,不太好找,要用心找。

扫描支付有两种模式:模式一和模式二:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5

我推荐使用模式二,应该说也是官方推荐的,因为它简化了很多步骤,让流程更容易让开发者理解

业务流程说明:

(1)商户后台系统根据用户选购的商品生成订单。
(2)用户确认支付后调用微信支付【统一下单API】生成预支付交易;
(3)微信支付系统收到请求后生成预支付交易单,并返回交易会话的二维码链接code_url。
(4)商户后台系统根据返回的code_url生成二维码。
(5)用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统。
(6)微信支付系统收到客户端请求,验证链接有效性后发起用户支付,要求用户授权。
(7)用户在微信客户端输入密码,确认支付后,微信客户端提交授权。
(8)微信支付系统根据用户授权完成支付交易。
(9)微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果通过短信、微信消息提示用户。微信客户端展示支付交易结果页面。
(10)微信支付系统通过发送异步消息通知商户后台系统支付结果。商户后台系统需回复接收情况,通知微信后台系统不再发送该单的支付通知。
(11)未收到支付通知的情况,商户后台系统调用【查询订单API】。
(12)商户确认订单已支付后给用户发货。

看了上面的流程简介,是不是感觉非常简单

一. 统一下单API

接口:https://api.mch.weixin.qq.com/pay/unifiedorder

接口参数说明:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1

二. 签名

微信的签名是三种支付方式中最简单的,没有使用公私钥的非对称加解密验签,而是用的MD5(注意在商户平台里设置MD5)。

详情请见:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=4_3

看看人家的签名步骤,就差在你背后教你手写代码了。还是公司大啊

签名完的xml格式:

<xml>
   <appid>wx2421b1c4370ec43b</appid>
   <attach>支付测试</attach>
   <body>JSAPI支付测试</body>
   <mch_id>10000100</mch_id>
   <detail><![CDATA[{ "goods_detail":[ { "goods_id":"iphone6s_16G", "wxpay_goods_id":"1001", "goods_name":"iPhone6s 16G", "quantity":1, "price":528800, "goods_category":"123456", "body":"苹果手机" }, { "goods_id":"iphone6s_32G", "wxpay_goods_id":"1002", "goods_name":"iPhone6s 32G", "quantity":1, "price":608800, "goods_category":"123789", "body":"苹果手机" } ] }]]></detail>
   <nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str>
   <notify_url>http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php</notify_url>
   <openid>oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid>
   <out_trade_no>1415659990</out_trade_no>
   <spbill_create_ip>14.23.150.211</spbill_create_ip>
   <total_fee>1</total_fee>
   <trade_type>JSAPI</trade_type>
   <sign>0CB01533B8C1EF103065174F50BCA001</sign>
</xml>

然后用requests库发送一个post请求就ok了

三. 生成二维码

在下单成功之后,会返回二维码的内容,拿到这个之后,自己在后台生成一个二维码图片给用户就可以了,是不是非常简单。

四. 异步回调

在用户扫码并支付成功之后,老规矩会触发一个异步通知,这个通知会通知支付的状态,一定要以这个通知为标准。处理完逻辑之后,一定要记得返回一个确认信息给微信

# 在处理好之后,一定要返回给微信
xml_str = MxPay.get_xml({"return_code": "SUCCESS"})
return HttpResponse(xml_str)

而且一定要记住,当用户支付成功之后,会不停的往你设定的这个异步回调地址发post请求,直到你回复了,才停止发送。所以在处理的时候,一定要判断是否处理过了

五. 申请退款

涉及到退款,那可马虎不得,微信也说了,下单随便下,退款那得慢慢来。所以在这里退款的操作,要特别注意的是需要带证书(微信支付签发的)

requests.post(url, data=json.dumps(xml_str, ensure_ascii=False),cert=(self.API_CLIENT_CERT_PATH, self.API_CLIENT_KEY_PATH))

整体来说,微信支付很简单,看看文档肯定是没有问题的。

setting文件的一些配置

# 微信分配的公众账号ID
APP_ID = "wx6534240dfae560"
# 微信支付分配的商户号
MCH_ID = "13459829292"
# 私钥(在商户后台设置的就是这个值,注意修改任何一段需要同步修改)
WX_MCH_KEY = "D3EG723wIxgv2jnEgkr38yNJ8cP05D6aoT"

# 异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。
ASYN_NOTIFY_URL = "http://xxxxxx.com:8888/test/weixin/"

# 统一下单地址
ORDER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder"

# 查询订单url
SEARCH_URL = "https://api.mch.weixin.qq.com/pay/orderquery"
# 关闭订单url
CLOSE_URL = "https://api.mch.weixin.qq.com/pay/closeorder"

# 申请退款url
REFUND_URL = "https://api.mch.weixin.qq.com/secapi/pay/refund"

# 查询申请退款
SEARCH_REFUND_URL = "https://api.mch.weixin.qq.com/pay/refundquery"

# 服务器存放证书路径(微信支付签发的)
API_CLIENT_CERT_PATH = "/path/your/cert/apiclient_cert.pem"
API_CLIENT_KEY_PATH = "/path/your/cert/apiclient_key.pem"

BT搜索    BT蚂蚁