美文网首页react-nativeiosReact-Native之跃
react-native-wechat微信组件的使用

react-native-wechat微信组件的使用

作者: Juice_gg | 来源:发表于2017-03-29 18:24 被阅读25253次

    版权声明:本文为博主原创文章,未经博主允许不得转载。


    react-native-wechat 具有微信 登录,分享,收藏(v1.9.9+) 和支付的功能,适合iOS/Android 双平台使用

    安装 react-native-wechat
    //npm 安装
    npm install react-native-wechat --save
    
    //yarn 安装
    yarn add react-native-wechat
    
    配置 react-native-wechat
    • iOS

    自动配置执行以下命令:

    react-native link react-native-wechat
    

    link成功命令行会提示

    Linking react-native-wechat ios dependency
    

    或者你还可以手动配置

    a.用xcode打开你的项目, 右键点击左侧项目目录Libraries文件夹 ➜ Add Files to <...>

    b.去node_modules ➜ react-native-wechat ➜ ios ➜ 选择 RCTWeChat.xcodeproj

    c.在工程Build Phases ➜ Link Binary With Libraries中添加libRCTWeChat.a(直接拖拽过去)

    工程配置

    在工程target的Build Phases->Link Binary with Libraries中加入以下库文件:

    SystemConfiguration.framework
    CoreTelephony.framework
    libsqlite3.0
    libc++
    libz
    

    点击TARGETS 下的项目名 -> info ,添加你的 申请的 微信 AppID到 "URL type"的"URL Schema"处


    添加URL Schema

    iOS9 以上,添加 微信白名单

    QQ20170329-170004.png

    或打开 info.plist源码添加:

    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>weixin</string>
        <string>wechat</string>
    </array>
    

    在你项目的AppDelegate.m添加以下代码,启动[LinkingIOS]

    #import <React/RCTLinkingManager.h>
    
    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
    sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
    {
      return [RCTLinkingManager application:application openURL:url
                                sourceApplication:sourceApplication annotation:annotation];
    }
    
    • Android

    android/settings.gradle文件下添加以下代码:

    include ':RCTWeChat'
    project(':RCTWeChat').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-wechat/android')
    

    android/app/build.gradledependencies部分添加以下代码:

    dependencies {
      compile project(':RCTWeChat')    // Add this line only.
    }
    

    MainActivity.java或者MainApplication.java文件中添加以下代码:

    import com.theweflex.react.WeChatPackage;       // Add this line before public class MainActivity
    ...
    
    /**
     * A list of packages used by the app. If the app uses additional views
     * or modules besides the default ones, add more packages here.
     */
    @Override
    protected List<ReactPackage> getPackages() {
      return Arrays.<ReactPackage>asList(
        new MainReactPackage(), 
        new WeChatPackage()        // Add this line
      );
    }
    

    在应用程序包中创建一个名为'wxapi'的包,并在其中创建一个名为'WXEntryActivity'的类。以便可以获得微信的授权和分享权限。

    package your.package.wxapi;
    
    import android.app.Activity;
    import android.os.Bundle;
    import com.theweflex.react.WeChatModule;
    
    public class WXEntryActivity extends Activity {
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        WeChatModule.handleIntent(getIntent());
        finish();
      }
    }
    

    (可选)在应用程序包中创建一个名为“wxapi”的包,并在其中创建一个名为“WXPayEntryActivity”的类。 以便可以获得微信支付权限。

    package your.package.wxapi;
    
    import android.app.Activity;
    import android.os.Bundle;
    import com.theweflex.react.WeChatModule;
    
    public class WXPayEntryActivity extends Activity {
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        WeChatModule.handleIntent(getIntent());
        finish();
      }
    }
    

    AndroidManifest.xml添加声明

    <manifest>
      <application>
        <activity
          android:name=".wxapi.WXEntryActivity"
          android:label="@string/app_name"
          android:exported="true"
        />
        <activity
          android:name=".wxapi.WXPayEntryActivity"
          android:label="@string/app_name"
          android:exported="true"
        />
      </application>
    </manifest>
    

    proguard-rules.pro中添加:

    -keep class com.tencent.mm.sdk.** {
       *;
    }
    

    API

    • registerApp(appid) :注册APP
    • registerAppWithDescription(appid, appdesc) : 注册APP(仅支持iOS)
    • isWXAppInstalled() :检查微信是否安装
    • isWXAppSupportApi()
    • getApiVersion() :获得微信SDK的版本
    • openWXApp() :打开微信APP
    • sendAuthRequest([scope[, state]]) :发送微信登录授权
    • shareToTimeline(data) : 分享到朋友圈
    • shareToSession(data) :分享到朋友
    • pay(data) :调用微信支付
    • addListener(eventType, listener[, context]) :监听状态
    • once(eventType, listener[, context]) :监听状态
    • removeAllListeners() :移除所有监听
    方法接口描述
    • registerApp(appid):注册微信SDK

    registerApp(appid)

    @params

    参数名 类型 默认值 描述
    appid string 微信后台的appid

    示例代码

    //建议在应用启动时初始化,初始化之前无法使用此模块的其他方法。WeChat模块只需要初始化一次。
    //const wechat = require('react-native-wechat')
    import *as wechat from 'react-native-wechat'
    // If you register here
    componentDidMount (){
      wechat.registerApp('your appid')
    }
    
    • registerAppWithDescription(appid, appdesc):注册微信SDK(仅对iOS有效)

    registerAppWithDescription(appid, appdesc)

    params

    参数名 类型 默认值 描述
    appid string 微信后台的appid
    appdesc string 对你的APP的描述
    • isWXAppInstalled() : 检查微信是否安装

    isWXAppInstalled()

    return
    {Promise}

    示例代码

    wechat.isWXAppInstalled()
       .then( ( isInstalled ) => {
            if ( isInstalled ) {
               ...
            } else {
              toastShort( '没有安装微信软件,请您安装微信之后再试' );
            }
        } );
    
    • isWXAppSupportApi() : 检查是否支持微信开放接口

    isWXAppSupportApi()

    return
    {Promise}
    示例代码

    同isWXAppInstalled
    
    • getApiVersion() : 获取微信SDK版本

    getApiVersion()

    return
    {Promise}
    示例代码

    同isWXAppInstalled
    
    • openWXApp() : 打开微信

    openWXApp()

    return
    {Promise}

    • sendAuthRequest([scope[, state]]) : 微信登录授权请求

    sendAuthRequest([scope[, state]])

    params

    参数名 类型 默认值 描述
    scope {Array/String} 应用授权作用域,如获取用户个人信息则填写snsapi_userinfo
    state {String} 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验

    return
    {Promise}

    示例代码

    //微信登录示例
    WXLogin = () => {
      let scope = 'snsapi_userinfo';
      let state = 'wechat_sdk_demo';
      //判断微信是否安装
      wechat.isWXAppInstalled()
        .then((isInstalled) => {
          if (isInstalled) {
            //发送授权请求
            wechat.sendAuthRequest(scope, state)
              .then(responseCode => {
                //返回code码,通过code获取access_token
                this.getAccessToken(responseCode.code);
              })
              .catch(err => {
                Alert.alert('登录授权发生错误:', err.message, [
                  {text: '确定'}
                ]);
              })
          } else {
            Platform.OS == 'ios' ?
              Alert.alert('没有安装微信', '是否安装微信?', [
                {text: '取消'},
                {text: '确定', onPress: () => this.installWechat()}
              ]) :
              Alert.alert('没有安装微信', '请先安装微信客户端在进行登录', [
                {text: '确定'}
              ])
          }
        })
    };
    
    参数名 类型 描述
    errCode Number ERR_OK = 0(用户同意) ERR_AUTH_DENIED = -4(用户拒绝授权)ERR_USER_CANCEL = -2(用户取消)
    errStr String
    openId String
    code String 用户换取access_token的code,仅在ErrCode为0时有效
    • shareToTimeline(data) : 分享到朋友圈

    shareToTimeline(data)

    params

    参数名 类型 描述
    thumbImage String 消息的Thumb图像,可以是uri或资源id
    type String {news/text/imageUrl/imageFile/imageResource/video/audio/file}
    webpageUrl String 如果typenews,则使用此分享url
    imageUrl String 如果typeimage,则使用此分享url
    videoUrl String 如果typevideo,则使用此分享url
    musicUrl String 如果typeaudio,则使用此分享url
    filePath String 如果typefile,则使用此获取本地文件
    fileExtension String 如果typefile,则使用此提供文件类型

    示例代码

    WeChat.shareToTimeline({
        type: 'imageUrl',
        title: 'web image',
        description: 'share web image to time line',
        mediaTagName: 'email signature',
        messageAction: undefined,
        messageExt: undefined,
        imageUrl: 'http://www.ncloud.hk/email-signature-262x100.png'
      });
    

    return

    参数名 类型 描述
    errCode Number 0 if authorization successed
    errStr String Error message if any error occurred
    • shareToSession(data) :分享到好友

    shareToSession(data)

    示例代码

    同 shareToTimeline(data) :
    
    • shareToFavorite(data) :收藏(v1.9.9+)

    shareToFavorite(data)

    示例代码

    同 shareToTimeline(data) :
    
    • pay(data) : 微信支付

    pay(data)

    示例代码

    const result = await WeChat.pay(
      {
        partnerId: '',  // 商家向财付通申请的商家id
        prepayId: '',   // 预支付订单
        nonceStr: '',   // 随机串,防重发
        timeStamp: '',  // 时间戳,防重发
        package: '',    // 商家根据财付通文档填写的数据和签名
        sign: ''        // 商家根据微信开放平台文档对数据做的签名
      }
    );
    

    return

    参数名 类型 描述
    errCode Number 0 if authorization successed
    errStr String Error message if any error occurred
    • addListener(eventType, listener[, context]) : 监听状态

    示例代码

            //监听分享状态
            // 'SendMessageToWX.Resp' 分享监听字段
            // 'PayReq.Resp'          支付监听字段
            // 'SendAuth.Resp'        登录监听字段
            wechat.addListener(
                'SendMessageToWX.Resp',
                (response) => {
                    if (parseInt(response.errCode) === 0) {
                        toastShort('分享成功');
                    } else {
                        toastShort('分享失败');
                    }
                }
            );
    
    • once(eventType, listener[, context])

    addListener类似,但是被调用一次后会被移除

    • removeAllListeners()

    移除所有监听事件


    本文参考react-native-wechat组件GitHub的说明文档翻译:https://github.com/weflex/react-native-wechat

    官方QQ交流群:



    问题搜集:
    1、在安卓机上测试的同学经常会遇到比如调用微信支付时闪一下就没了的问题,这个问题100%跟签名有关,请检查你的签名。
    debug版本和release版本的签名是不同的,请注意
    2、如果遇到RN低于0.40版本无法使用的问题,请降级react-native-wechat试一下

    相关文章

      网友评论

      • 653361d01398:问题一大堆
      • abcdeuck:A problem occurred configuring project ':RCTWeChat'.
        > The SDK Build Tools revision (23.0.1) is too low for project ':RCTWeChat'. Minimum required is 25.0.0

        题主请问一下这个问题该如何解决?我们项目的是 compileSdkVersion 27
        buildToolsVersion '27.0.1',但是不知道为啥会一直报这个错误,然后也不知道该去哪里改
      • zy_mr:我的RN0.51,使用的react-native-wechat 1.9.9 .有个很奇怪的问题,调用微信支付的时候,闪一下屏,然后什么都没有,我是打包出来的正式版了,不是debug版,而且签名跟包名我对过很多遍了不会错的.而且分享到朋友圈跟分享到微信好友又是可以的,也就是注册AppId没有问题...作者大大有没有遇到过这个问题
      • 4d9b5da3ee5c:请问分享方法返回错误代码-6是什么意思呢
        在楼下吃炸鸡:看一下这个,,完美解决https://github.com/yorkie/react-native-wechat/issues/354
      • chaecho:你好,我想问一下能不能分享小程序呢?
      • e2f11fd62dd4:Android导入RCTWeChat改名react-native-wechat才能成功导入,也不知道是啥原因
      • uuuuuuw:调用打开微信可以 但是分享 就无法调起
      • 春田花花_1987:怎么获取微信分享成功的事件呢,两种方法试了都没反应
        WeChat.addListener(
        'SendMessageToWX.Resp',
        (response) => {
        console.log('res',response)
        if (parseInt(response.errCode) === 0) {
        ToastAndroid.show('分享成功', ToastAndroid.SHORT);
        } else {
        ToastAndroid.show('分享失败', ToastAndroid.SHORT);
        }
        }
        );
        ----
        WeChat.isWXAppInstalled()
        .then(async (isInstalled) => {
        if (isInstalled) {
        let result = await WeChat.shareToSession({
        type:'news',
        title: params.title,
        description: params.content,
        thumbImage: params.w_pic,
        webpageUrl:params.url
        }).then(res=>{
        console.log('share',res)
        });
        console.log('share image url to time line successful:', result);
        } else {
        Alert.alert('提示','没有安装微信软件,请您安装微信之后再试');
        }
        });
        ;
      • 鹏雨燕:你好。有微信图标时,但是未安装app,apple审核需要调起网页授权,这个该怎么处理呢
      • Black_Angel:调用wechat.sendAuthRequest(scope, state)之后,程序没有任何反应,回调函数没有走,是什么情况???
        爱上似蚂蚁的生活:@爱上似蚂蚁的生活 我已经解决,解决地址在这里。https://github.com/yorkie/react-native-wechat/issues/286

        给后来人一点提示。这个问题困绕了我半个月、。
        爱上似蚂蚁的生活:问题解决了吗,我也遇到了这个问题,能不能分享一下解决方法。
        不要脸的企鹅:找到错误了吗
      • c018f10e65ab:你好,我配置了,能够调起微信登录界面,点击确认 后台打印请求成功,但是前台不回调内容,前台监听事件捕捉不到 登录后返回的信息,请问这个问题,我该怎么做呢
        爱上似蚂蚁的生活:问题解决了吗,我也遇到了这个问题,能不能分享一下解决方法。
        Black_Angel:哥们,你这个问题,解决了吗???
      • 小心搬砖:Ios 中WeChat.isWXAppInstalled() 判断有没有安装微信 始终返回false,这个是什么原因,求指导
      • 76ba88ecb7ac:怎么降低 react-native-wechat 的版本呀 我的 Xcode link 后就报这个
        Showing Recent Issues
        ld: library not found for -lyoga

        错误 我的 React-Native 是 0.39.2 的
      • Elbert_Z:分享完成后自动返回app怎么实现,小白求指教
        Elbert_Z:点击 返回原app 的按钮,没有反应
      • Mr丿black灬:调不起来 登录和分享怎么办 弄了一天 都一样就是 调不起来
        uuuuuuw:哥们 你后面解决了么
      • fighterboy:不走回调支付成功
        fighterboy:@Elbert_Z 我是也写 支付宝 支付 他们回调地址重复了
        Elbert_Z:兄弟,这个问题问出来了么
        Juice_gg:@fighterboy 可以去官方群里问一下
      • 977d656db419:支付完成后回到App不执行回调
        Elbert_Z:兄弟,这个问题问出来了么
        Juice_gg:@锈忆渴青 可以去官方群里看一下
      • 蜗牛慢慢跑:debug模式下无法唤起授权页面,errCode=-6 但是release版没问题
      • 司马捷:Unable to resolve module `events` from
        /node_modules/react-native-wechat/index.js`: Module does not exist in the module map 有遇到过吗
      • 217f420bfc40:已经装了cocoapod的情况下,是会报错的!烦请作者帮忙解决一下这个问题啊!!
        Drck:请问是找不到React/RCTBridgeModule.h报错吗,解决了吗
      • fighterboy:有 demo么 参考下。我那个报错 说我 WeChatSDK没有引入


      • 16acedcebd0f:iOS资源下载 => 开发工具包(SDK) => iOS开发工具包(1.8.0版本,不包含支付功能)
        请问微信开放平台里的这个包有什么作用,怎么用,我做的是RN ios 的app,现在正在微信开放平台审核 ,现在还没有appid ,装了react-native-wechat 包, 试了一下isWXAppInstalled(),是可以的,其他测试估计要等有了appid装真机之后才能测试
      • 走在字里行间:请教个问题,我用微信分享一个连接给好友,好友点开链接但是收藏不成功,在没点开链接之前长按会出现收藏,这里是可以收藏,点开链接就不能收藏了,请问这是什么原因
      • zheng小叶:registerApp(appid) 一执行这,就报错,楼主知道原因么?"evaluating Wechat.registerApp"
        zheng小叶:@新鲜的男尸 恩好的,我试试,谢谢了~
        新鲜的男尸:你是用命令导入的wechat吗?如果是的话,可以选择手动导入,我刚开始用命令导入的也报的这个错误,然后改手动的就好了
      • iOS_Ken:Xcode配置微信支付后,一直报链接命令失败?
      • 还没想到叫什么:安卓的分享,不知到为什么,个别数据分享不出去,点击微信之后就报了一个警告warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.这个怎么处理呢
        晓旭_3d13:我这回调监听都收不到怎么回事。。。你问题解决了吗
        还没想到叫什么:@Juice_g 只用了一个监听
        componentDidMount(){
        WeChat.addListener('SendMessageToWX.Resp',(response)=>{
        if (parseInt(response.errCode) === 0) {
        this.props.pressCancel()
        Alert.alert('','分享成功',[{text:'确定',onPress:()=>{}}]);
        } else {
        // Alert.alert('','分享失败',JSON.stringify(response));
        }
        })
        }
        componentWillUnmount(){
        WeChat.removeAllListeners()
        }
        Juice_gg:你是不是监听用的太多了
      • 还没想到叫什么:我分享的图片如果想用项目里的图片资源应该怎么写呢?
        Juice_gg:@活成我喜欢的样子 放到你们服务器上不就行了
        还没想到叫什么:@Juice_gg 对哦,那怎么办,难不成专门再做一个获取logo的接口:joy:
        Juice_gg:用项目里的图片资源,分享出去以后别人怎么看?
      • f2b57f7a7e44:pay方法是不是自动打开微信并支付了?
        涅磐广广:你好,我这里调用微信支付,发现没有反应,我输入WeChat.pay的结果,给我显示的是{_45:0,_81:0,_65:null,_54:null
        Juice_gg:直接打开微信跳转到微信支付界面
      • 6seaq:您好,请问使用react-native-wechat是不是需要react-native的版本大于4.0呢
        Juice_gg:@少年心已凉丶 哪个导入会报错啊?
        6seaq:@少年心已凉丶 我demo 是用的0.4以上的,微信分享成功了,但是做的项目是0.37的,可是一导入报错:pensive::pensive:
        Juice_gg:不需要吧,0.40以下也可以用吧
      • 45b645c5912e:您好 我的回调方法不走 你有遇见过么
        Juice_gg:@isBool是不是你的安卓签名有问题呢?
        isBool:调试模式可以实现登陆取返回值,编译为Release后调用(Android)sendAuthRequest方法微信闪退。不知道您有遇到过类似的问题么,或者有没有啥好的解决方法呢 ?
        Juice_gg:哪个回调方法不走?

      本文标题:react-native-wechat微信组件的使用

      本文链接:https://www.haomeiwen.com/subject/dfqyottx.html