feat: ios add choose invoice

This commit is contained in:
Tom Xu 2020-12-26 14:24:14 +08:00
parent 2e1a33be8d
commit 98c31c7c9f
3 changed files with 193 additions and 135 deletions

167
index.d.ts vendored
View File

@ -2,13 +2,13 @@
* *
*/ */
enum WXScene { enum WXScene {
WXSceneSession = 0, /**< 聊天界面 */ WXSceneSession = 0 /**< 聊天界面 */,
WXSceneTimeline = 1, /**< 朋友圈 */ WXSceneTimeline = 1 /**< 朋友圈 */,
WXSceneFavorite = 2, /**< 收藏 */ WXSceneFavorite = 2 /**< 收藏 */,
WXSceneSpecifiedSession = 3, /**< 指定联系人 */ WXSceneSpecifiedSession = 3 /**< 指定联系人 */,
}; }
declare module "react-native-wechat-lib" { declare module 'react-native-wechat-lib' {
export function registerApp(appId: string, universalLink?: string): Promise<boolean>; export function registerApp(appId: string, universalLink?: string): Promise<boolean>;
export function isWXAppInstalled(): Promise<boolean>; export function isWXAppInstalled(): Promise<boolean>;
export function isWXAppSupportApi(): Promise<boolean>; export function isWXAppSupportApi(): Promise<boolean>;
@ -24,35 +24,24 @@ declare module "react-native-wechat-lib" {
country?: string; country?: string;
} }
export interface WeChatReq { export interface WeChatReq {
type?: string, type?: string;
errStr?: string, errStr?: string;
extMsg?: string, extMsg?: string;
country?: string, country?: string;
state?: string, state?: string;
returnKey?: string returnKey?: string;
} }
export interface WeChatResp { export interface WeChatResp {
type?: string, type?: string;
errStr?: string, errStr?: string;
extMsg?: string, extMsg?: string;
country?: string, country?: string;
state?: string, state?: string;
returnKey?: string returnKey?: string;
} }
export function sendAuthRequest( export function sendAuthRequest(scope: string | string[], state?: string): Promise<AuthResponse>;
scope: string | string[],
state?: string
): Promise<AuthResponse>;
export interface ShareMetadata { export interface ShareMetadata {
type: type: 'news' | 'text' | 'imageUrl' | 'imageFile' | 'imageResource' | 'video' | 'audio' | 'file';
| "news"
| "text"
| "imageUrl"
| "imageFile"
| "imageResource"
| "video"
| "audio"
| "file";
thumbImage?: string; thumbImage?: string;
description?: string; description?: string;
webpageUrl?: string; webpageUrl?: string;
@ -63,88 +52,88 @@ declare module "react-native-wechat-lib" {
fileExtension?: string; fileExtension?: string;
} }
export interface ShareTextMetadata { export interface ShareTextMetadata {
text: string, text: string;
scene?: WXScene scene?: WXScene;
} }
export interface ShareImageMetadata { export interface ShareImageMetadata {
imageUrl: string, imageUrl: string;
scene?: WXScene scene?: WXScene;
} }
export interface ShareMusicMetadata { export interface ShareMusicMetadata {
musicUrl: string, musicUrl: string;
musicLowBandUrl?: string, musicLowBandUrl?: string;
musicDataUrl?: string, musicDataUrl?: string;
musicLowBandDataUrl?: string, musicLowBandDataUrl?: string;
title?: string, title?: string;
description?: string, description?: string;
thumbImageUrl?: string, thumbImageUrl?: string;
scene?: WXScene scene?: WXScene;
} }
export interface ShareVideoMetadata { export interface ShareVideoMetadata {
videoUrl: string, videoUrl: string;
videoLowBandUrl?: string, videoLowBandUrl?: string;
title?: string, title?: string;
description?: string, description?: string;
thumbImageUrl?: string, thumbImageUrl?: string;
scene?: WXScene scene?: WXScene;
} }
export interface ShareWebpageMetadata { export interface ShareWebpageMetadata {
webpageUrl: string, webpageUrl: string;
title?: string, title?: string;
description?: string, description?: string;
thumbImageUrl?: string, thumbImageUrl?: string;
scene?: WXScene scene?: WXScene;
} }
export interface ShareMiniProgramMetadata { export interface ShareMiniProgramMetadata {
webpageUrl: string, webpageUrl: string;
userName: string, userName: string;
path?: string, path?: string;
hdImageUrl?: string, hdImageUrl?: string;
withShareTicket?: string, withShareTicket?: string;
miniProgramType?: number, miniProgramType?: number;
title?: string, title?: string;
description?: string, description?: string;
thumbImageUrl?: string, thumbImageUrl?: string;
scene?: WXScene scene?: WXScene;
} }
export interface LaunchMiniProgramMetadata { export interface LaunchMiniProgramMetadata {
userName: string, userName: string;
miniProgramType?: number, miniProgramType?: number;
path?: string path?: string;
} }
export interface SubscribeMessageMetadata { export interface SubscribeMessageMetadata {
scene?: WXScene, scene?: WXScene;
templateId: string, templateId: string;
reserved?: string reserved?: string;
} }
export function shareText( export function shareText(
message: ShareTextMetadata message: ShareTextMetadata,
): Promise<{ errCode?: number; errStr?: string }>; ): Promise<{ errCode?: number; errStr?: string }>;
export function shareImage( export function shareImage(
message: ShareImageMetadata message: ShareImageMetadata,
): Promise<{ errCode?: number; errStr?: string }>; ): Promise<{ errCode?: number; errStr?: string }>;
export function shareLocalImage( export function shareLocalImage(
message: ShareImageMetadata message: ShareImageMetadata,
): Promise<{ errCode?: number; errStr?: string }>; ): Promise<{ errCode?: number; errStr?: string }>;
export function shareMusic( export function shareMusic(
message: ShareMusicMetadata message: ShareMusicMetadata,
): Promise<{ errCode?: number; errStr?: string }>; ): Promise<{ errCode?: number; errStr?: string }>;
export function shareVideo( export function shareVideo(
message: ShareVideoMetadata message: ShareVideoMetadata,
): Promise<{ errCode?: number; errStr?: string }>; ): Promise<{ errCode?: number; errStr?: string }>;
export function shareWebpage( export function shareWebpage(
message: ShareWebpageMetadata message: ShareWebpageMetadata,
): Promise<{ errCode?: number; errStr?: string }>; ): Promise<{ errCode?: number; errStr?: string }>;
export function shareMiniProgram( export function shareMiniProgram(
message: ShareMiniProgramMetadata message: ShareMiniProgramMetadata,
): Promise<{ errCode?: number; errStr?: string }>; ): Promise<{ errCode?: number; errStr?: string }>;
export function launchMiniProgram( export function launchMiniProgram(
message: LaunchMiniProgramMetadata message: LaunchMiniProgramMetadata,
): Promise<{ errCode?: number; errStr?: string }>; ): Promise<{ errCode?: number; errStr?: string }>;
export function subscribeMessage( export function subscribeMessage(
message: SubscribeMessageMetadata message: SubscribeMessageMetadata,
): Promise<{ errCode?: number; errStr?: string }>; ): Promise<{ errCode?: number; errStr?: string }>;
export interface PaymentLoad { export interface PaymentLoad {
partnerId: string; partnerId: string;
@ -154,7 +143,21 @@ declare module "react-native-wechat-lib" {
package: string; package: string;
sign: string; sign: string;
} }
export function pay( export function pay(payload: PaymentLoad): Promise<{ errCode?: number; errStr?: string }>;
payload: PaymentLoad
): Promise<{ errCode?: number; errStr?: string }>; export interface ChooseInvoice {
signType?: string;
nonceStr?: string;
timeStamp?: number;
cardSign?: string;
}
export interface Invoice {
cardId: string;
encryptCode: string;
}
export function chooseInvoice(
data: ChooseInvoice,
): Promise<{ errCode?: number; errStr?: string; cards: Invoice[] }>;
} }

View File

@ -1,7 +1,7 @@
'use strict'; 'use strict';
import { EventEmitter } from 'events';
import { DeviceEventEmitter, NativeModules, Platform } from 'react-native'; import { DeviceEventEmitter, NativeModules, Platform } from 'react-native';
import { EventEmitter } from 'events';
let isAppRegistered = false; let isAppRegistered = false;
const { WeChat } = NativeModules; const { WeChat } = NativeModules;
@ -9,11 +9,11 @@ const { WeChat } = NativeModules;
// Event emitter to dispatch request and response from WeChat. // Event emitter to dispatch request and response from WeChat.
const emitter = new EventEmitter(); const emitter = new EventEmitter();
DeviceEventEmitter.addListener('WeChat_Resp', resp => { DeviceEventEmitter.addListener('WeChat_Resp', (resp) => {
emitter.emit(resp.type, resp); emitter.emit(resp.type, resp);
}); });
DeviceEventEmitter.addListener('WeChat_Req', resp => { DeviceEventEmitter.addListener('WeChat_Req', (resp) => {
emitter.emit(resp.type, resp); emitter.emit(resp.type, resp);
}); });
@ -25,12 +25,12 @@ function wrapRegisterApp(nativeFunc) {
if (isAppRegistered) { if (isAppRegistered) {
return Promise.resolve(true); return Promise.resolve(true);
} }
isAppRegistered = true;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
nativeFunc.apply(null, [ nativeFunc.apply(null, [
...args, ...args,
(error, result) => { (error, result) => {
if (!error) { if (!error) {
isAppRegistered = true;
return resolve(result); return resolve(result);
} }
if (typeof error === 'string') { if (typeof error === 'string') {
@ -158,6 +158,7 @@ const nativeShareWebpage = wrapApi(WeChat.shareWebpage);
const nativeShareMiniProgram = wrapApi(WeChat.shareMiniProgram); const nativeShareMiniProgram = wrapApi(WeChat.shareMiniProgram);
const nativeSubscribeMessage = wrapApi(WeChat.subscribeMessage); const nativeSubscribeMessage = wrapApi(WeChat.subscribeMessage);
const nativeChooseInvoice = wrapApi(WeChat.chooseInvoice);
/** /**
* @method sendAuthRequest * @method sendAuthRequest
@ -167,7 +168,7 @@ const nativeSubscribeMessage = wrapApi(WeChat.subscribeMessage);
export function sendAuthRequest(scopes, state) { export function sendAuthRequest(scopes, state) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
WeChat.sendAuthRequest(scopes, state, () => {}); WeChat.sendAuthRequest(scopes, state, () => {});
emitter.once('SendAuth.Resp', resp => { emitter.once('SendAuth.Resp', (resp) => {
if (resp.errCode === 0) { if (resp.errCode === 0) {
resolve(resp); resolve(resp);
} else { } else {
@ -184,11 +185,29 @@ export function sendAuthRequest(scopes, state) {
*/ */
export function shareText(data) { export function shareText(data) {
if (data && data.scene == null) { if (data && data.scene == null) {
data.scene = 0 data.scene = 0;
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
nativeShareText(data); nativeShareText(data);
emitter.once('SendMessageToWX.Resp', resp => { emitter.once('SendMessageToWX.Resp', (resp) => {
if (resp.errCode === 0) {
resolve(resp);
} else {
reject(new WechatError(resp));
}
});
});
}
/**
* Choose Invoice
* @method chooseInvoice
* @param {Object} data
*/
export function chooseInvoice(data) {
return new Promise((resolve, reject) => {
nativeChooseInvoice(data);
emitter.once('WXChooseInvoiceResp.Resp', (resp) => {
if (resp.errCode === 0) { if (resp.errCode === 0) {
resolve(resp); resolve(resp);
} else { } else {
@ -205,11 +224,11 @@ export function shareText(data) {
*/ */
export function shareImage(data) { export function shareImage(data) {
if (data && data.scene == null) { if (data && data.scene == null) {
data.scene = 0 data.scene = 0;
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
nativeShareImage(data); nativeShareImage(data);
emitter.once('SendMessageToWX.Resp', resp => { emitter.once('SendMessageToWX.Resp', (resp) => {
if (resp.errCode === 0) { if (resp.errCode === 0) {
resolve(resp); resolve(resp);
} else { } else {
@ -226,11 +245,11 @@ export function shareImage(data) {
*/ */
export function shareLocalImage(data) { export function shareLocalImage(data) {
if (data && data.scene == null) { if (data && data.scene == null) {
data.scene = 0 data.scene = 0;
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
nativeShareLocalImage(data); nativeShareLocalImage(data);
emitter.once('SendMessageToWX.Resp', resp => { emitter.once('SendMessageToWX.Resp', (resp) => {
if (resp.errCode === 0) { if (resp.errCode === 0) {
resolve(resp); resolve(resp);
} else { } else {
@ -247,11 +266,11 @@ export function shareLocalImage(data) {
*/ */
export function shareMusic(data) { export function shareMusic(data) {
if (data && data.scene == null) { if (data && data.scene == null) {
data.scene = 0 data.scene = 0;
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
nativeShareMusic(data); nativeShareMusic(data);
emitter.once('SendMessageToWX.Resp', resp => { emitter.once('SendMessageToWX.Resp', (resp) => {
if (resp.errCode === 0) { if (resp.errCode === 0) {
resolve(resp); resolve(resp);
} else { } else {
@ -268,11 +287,11 @@ export function shareMusic(data) {
*/ */
export function shareVideo(data) { export function shareVideo(data) {
if (data && data.scene == null) { if (data && data.scene == null) {
data.scene = 0 data.scene = 0;
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
nativeShareVideo(data); nativeShareVideo(data);
emitter.once('SendMessageToWX.Resp', resp => { emitter.once('SendMessageToWX.Resp', (resp) => {
if (resp.errCode === 0) { if (resp.errCode === 0) {
resolve(resp); resolve(resp);
} else { } else {
@ -289,11 +308,11 @@ export function shareVideo(data) {
*/ */
export function shareWebpage(data) { export function shareWebpage(data) {
if (data && data.scene == null) { if (data && data.scene == null) {
data.scene = 0 data.scene = 0;
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
nativeShareWebpage(data); nativeShareWebpage(data);
emitter.once('SendMessageToWX.Resp', resp => { emitter.once('SendMessageToWX.Resp', (resp) => {
if (resp.errCode === 0) { if (resp.errCode === 0) {
resolve(resp); resolve(resp);
} else { } else {
@ -309,14 +328,14 @@ export function shareWebpage(data) {
*/ */
export function shareMiniProgram(data) { export function shareMiniProgram(data) {
if (data && data.scene == null) { if (data && data.scene == null) {
data.scene = 0 data.scene = 0;
} }
if (data && data.miniProgramType == null) { if (data && data.miniProgramType == null) {
data.miniProgramType = 0 data.miniProgramType = 0;
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
nativeShareMiniProgram(data); nativeShareMiniProgram(data);
emitter.once('SendMessageToWX.Resp', resp => { emitter.once('SendMessageToWX.Resp', (resp) => {
if (resp.errCode === 0) { if (resp.errCode === 0) {
resolve(resp); resolve(resp);
} else { } else {
@ -337,11 +356,16 @@ export function shareMiniProgram(data) {
export function launchMiniProgram({ userName, miniProgramType = 0, path = '' }) { export function launchMiniProgram({ userName, miniProgramType = 0, path = '' }) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (miniProgramType !== 0 && miniProgramType !== 1 && miniProgramType !== 2) { if (miniProgramType !== 0 && miniProgramType !== 1 && miniProgramType !== 2) {
reject(new WechatError({errStr: '拉起小程序的类型不对0-正式版 1-开发版 2-体验版', errCode: -1})) reject(
return new WechatError({
errStr: '拉起小程序的类型不对0-正式版 1-开发版 2-体验版',
errCode: -1,
}),
);
return;
} }
nativeLaunchMiniProgram({ userName, miniProgramType, path }); nativeLaunchMiniProgram({ userName, miniProgramType, path });
emitter.once('WXLaunchMiniProgramReq.Resp', resp => { emitter.once('WXLaunchMiniProgramReq.Resp', (resp) => {
if (resp.errCode === 0) { if (resp.errCode === 0) {
resolve(resp); resolve(resp);
} else { } else {
@ -358,11 +382,11 @@ export function launchMiniProgram({userName, miniProgramType = 0, path = ''}) {
*/ */
export function subscribeMessage(data) { export function subscribeMessage(data) {
if (data && data.scene == null) { if (data && data.scene == null) {
data.scene = 0 data.scene = 0;
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
nativeSubscribeMessage(data); nativeSubscribeMessage(data);
emitter.once('WXSubscribeMsgReq.Resp', resp => { emitter.once('WXSubscribeMsgReq.Resp', (resp) => {
if (resp.errCode === 0) { if (resp.errCode === 0) {
resolve(resp); resolve(resp);
} else { } else {
@ -388,7 +412,7 @@ export function subscribeMessage(data) {
export function shareToFavorite(data) { export function shareToFavorite(data) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
nativeShareToFavorite(data); nativeShareToFavorite(data);
emitter.once('SendMessageToWX.Resp', resp => { emitter.once('SendMessageToWX.Resp', (resp) => {
if (resp.errCode === 0) { if (resp.errCode === 0) {
resolve(resp); resolve(resp);
} else { } else {
@ -423,13 +447,13 @@ export function pay(data) {
// FIXME(94cstyles) // FIXME(94cstyles)
// Android requires the type of the timeStamp field to be a string // Android requires the type of the timeStamp field to be a string
if (Platform.OS === 'android') data.timeStamp = String(data.timeStamp) if (Platform.OS === 'android') data.timeStamp = String(data.timeStamp);
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
WeChat.pay(data, result => { WeChat.pay(data, (result) => {
if (result) reject(result); if (result) reject(result);
}); });
emitter.once('PayReq.Resp', resp => { emitter.once('PayReq.Resp', (resp) => {
if (resp.errCode === 0) { if (resp.errCode === 0) {
resolve(resp); resolve(resp);
} else { } else {
@ -458,4 +482,3 @@ export class WechatError extends Error {
} }
} }
} }

View File

@ -240,6 +240,26 @@ RCT_EXPORT_METHOD(shareText:(NSDictionary *)data
[WXApi sendReq:req completion:completion]; [WXApi sendReq:req completion:completion];
} }
//
RCT_EXPORT_METHOD(chooseInvoice:(NSDictionary *)data
:(RCTResponseSenderBlock)callback)
{
WXChooseInvoiceReq *req = [[WXChooseInvoiceReq alloc] init];
req.appID = self.appId;
req.timeStamp = [data[@"timeStamp"] intValue];
req.nonceStr = data[@"nonceStr"];
req.cardSign = data[@"cardSign"];
req.signType = data[@"signType"];
void ( ^ completion )( BOOL );
completion = ^( BOOL success )
{
callback(@[success ? [NSNull null] : INVOKE_FAILED]);
return;
};
[WXApi sendReq:req completion:completion];
}
// //
RCT_EXPORT_METHOD(shareImage:(NSDictionary *)data RCT_EXPORT_METHOD(shareImage:(NSDictionary *)data
:(RCTResponseSenderBlock)callback) :(RCTResponseSenderBlock)callback)
@ -581,6 +601,18 @@ RCT_EXPORT_METHOD(pay:(NSDictionary *)data
body[@"extMsg"] = r.extMsg; body[@"extMsg"] = r.extMsg;
body[@"type"] = @"WXLaunchMiniProgramReq.Resp"; body[@"type"] = @"WXLaunchMiniProgramReq.Resp";
[self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body];
} else if ([resp isKindOfClass:[WXChooseInvoiceResp class]]){
WXChooseInvoiceResp *r = (WXChooseInvoiceResp *)resp;
NSMutableDictionary *body = @{@"errCode":@(r.errCode)}.mutableCopy;
body[@"errStr"] = r.errStr;
NSMutableArray *arr = [[NSMutableArray alloc] init];
for (WXCardItem* cardItem in r.cardAry) {
NSMutableDictionary *item = @{@"cardId":cardItem.cardId,@"encryptCode":cardItem.encryptCode}.mutableCopy;
[arr addObject:item];
}
body[@"cards"] = arr;
body[@"type"] = @"WXChooseInvoiceResp.Resp";
[self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body];
} }
} }