diff --git a/.DS_Store b/.DS_Store index c171d40..95008b0 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/README.md b/README.md index 9189783..97f12b1 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,16 @@ $ react-native link react-native-puti-pay #### Android +在android/app/build.gradle下 +``` + repositories { + flatDir { + dirs 'libs','../../node_modules/react-native-puti-pay/android/libs' + } +} + +``` + 在包名目录下创建wxapi文件夹,新建一个名为`WXPayEntryActivity`的activity继承 `com.puti.paylib`包名下的`XWXPayEntryActivity`。 ``` @@ -169,4 +179,4 @@ $ react-native link react-native-puti-pay 2. ios 支付完没有返回商家按钮 ios应用间跳转判断跳转到哪个应用是通过上面ios配置第三部设置的URL Scheme区分的。`XPay.setWxId()`,`XPay.setAlipayScheme()` 方法都是通过支付的sdk将Scheme传给微信支付宝,支付成功后才能正确跳转回应用,也才有返回商家按钮 - 所有要是没有此功能,请再对照文档检查一遍 + 所有要是没有此功能,请再对照文档检查一遍 diff --git a/android/.DS_Store b/android/.DS_Store index bc8ff35..5100725 100644 Binary files a/android/.DS_Store and b/android/.DS_Store differ diff --git a/android/.gradle/7.0-rc-1/dependencies-accessors/dependencies-accessors.lock b/android/.gradle/7.0-rc-1/dependencies-accessors/dependencies-accessors.lock new file mode 100644 index 0000000..727b5e8 Binary files /dev/null and b/android/.gradle/7.0-rc-1/dependencies-accessors/dependencies-accessors.lock differ diff --git a/android/.gradle/7.0-rc-1/dependencies-accessors/gc.properties b/android/.gradle/7.0-rc-1/dependencies-accessors/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/android/.gradle/7.0-rc-1/fileChanges/last-build.bin b/android/.gradle/7.0-rc-1/fileChanges/last-build.bin new file mode 100644 index 0000000..f76dd23 Binary files /dev/null and b/android/.gradle/7.0-rc-1/fileChanges/last-build.bin differ diff --git a/android/.gradle/7.0-rc-1/fileHashes/fileHashes.lock b/android/.gradle/7.0-rc-1/fileHashes/fileHashes.lock new file mode 100644 index 0000000..f5a26da Binary files /dev/null and b/android/.gradle/7.0-rc-1/fileHashes/fileHashes.lock differ diff --git a/android/.gradle/7.0-rc-1/gc.properties b/android/.gradle/7.0-rc-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/android/.gradle/checksums/checksums.lock b/android/.gradle/checksums/checksums.lock new file mode 100644 index 0000000..2ee2fdf Binary files /dev/null and b/android/.gradle/checksums/checksums.lock differ diff --git a/android/.gradle/configuration-cache/gc.properties b/android/.gradle/configuration-cache/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/android/.gradle/vcs-1/gc.properties b/android/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/android/.project b/android/.project new file mode 100644 index 0000000..ce3ae0a --- /dev/null +++ b/android/.project @@ -0,0 +1,28 @@ + + + android + Project android created by Buildship. + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.buildship.core.gradleprojectnature + + + + 1631606901641 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + + diff --git a/android/.settings/org.eclipse.buildship.core.prefs b/android/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 0000000..e0001ef --- /dev/null +++ b/android/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,13 @@ +arguments= +auto.sync=false +build.scans.enabled=false +connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(7.0-rc-1)) +connection.project.dir= +eclipse.preferences.version=1 +gradle.user.home= +java.home=/Library/Java/JavaVirtualMachines/adoptopenjdk-13.jdk/Contents/Home +jvm.arguments= +offline.mode=false +override.workspace.settings=true +show.console.view=true +show.executions.view=true diff --git a/android/build.gradle b/android/build.gradle index cb2b0d0..046229c 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -14,6 +14,13 @@ android { versionCode 1 versionName "1.0" } + repositories { + flatDir { + dirs 'libs' + } + } + sourceSets.main.jniLibs.srcDirs=['libs'] + buildTypes { release { minifyEnabled false @@ -23,8 +30,9 @@ android { } dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.facebook.react:react-native:+' // From node_modules - compile files('libs/alipaySdk-20180601.jar') + compile (name: 'alipaysdk-15.8.03.210428205839', ext: 'aar') compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+' } diff --git a/android/libs/alipaySdk-20180601.jar b/android/libs/alipaySdk-20180601.jar deleted file mode 100644 index 8af9c90..0000000 Binary files a/android/libs/alipaySdk-20180601.jar and /dev/null differ diff --git a/android/libs/alipaysdk-15.8.03.210428205839.aar b/android/libs/alipaysdk-15.8.03.210428205839.aar new file mode 100644 index 0000000..b2cf3f4 Binary files /dev/null and b/android/libs/alipaysdk-15.8.03.210428205839.aar differ diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index d9e2366..c15b4ae 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -13,18 +13,6 @@ android:label="@string/app_name" android:supportsRtl="true"> - - diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..2c74caf --- /dev/null +++ b/index.d.ts @@ -0,0 +1,29 @@ +type wxParams = { + partnerId: string; + prepayId: string; + packageValue: string; + nonceStr: string; + timeStamp: string; + sign: string; +}; +type aliRes = { + memo: string; + result: string; + resultStatus: string; +}; +type wxRes = { + errStr: string; + errCode: string; + type: string; +}; +export declare class XPay { + static alipay: (orderInfo: string, callback: (res: aliRes) => void) => void; + + static setWxId: (id: string) => void; + + static setAlipayScheme: (scheme: string) => void; + + static setAlipaySandbox: (isSandBox: boolean) => void; + + static wxPay: (params: wxParams, callback: (res: wxRes) => void) => void; +} diff --git a/index.js b/index.js index 0c00e18..45341fd 100644 --- a/index.js +++ b/index.js @@ -4,47 +4,44 @@ * GitHub:https://github.com/puti94 * Email:1059592160@qq.com */ -import {NativeModules, Platform} from 'react-native' +import { NativeModules, Platform } from "react-native"; -export default class XPay { - - /** - * 支付宝Android端支付 - * @param orderInfo 订单号 - * @param callback 支付宝回调结果 详情见 https://docs.open.alipay.com/204/105301 - */ - static alipay(orderInfo, callback) { - NativeModules.PutiPay.alipay(orderInfo, callback) - } +export class XPay { + /** + * 支付宝Android端支付 + * @param orderInfo 订单号 + * @param callback 支付宝回调结果 详情见 https://docs.open.alipay.com/204/105301 + */ + static alipay(orderInfo, callback) { + NativeModules.PutiPay.alipay(orderInfo, callback); + } + /** + * 设置微信APPID + * @param id + */ + static setWxId(id) { + NativeModules.PutiPay.setWxId(id); + } - /** - * 设置微信APPID - * @param id - */ - static setWxId(id) { - NativeModules.PutiPay.setWxId(id); - } - - /** - * 设置支付宝跳转Scheme - * @param scheme - */ - static setAlipayScheme(scheme) { - if (Platform.OS === 'ios') - NativeModules.PutiPay.setAlipayScheme(scheme); - } + /** + * 设置支付宝跳转Scheme + * @param scheme + */ + static setAlipayScheme(scheme) { + if (Platform.OS === "ios") NativeModules.PutiPay.setAlipayScheme(scheme); + } - /** - * 设置支付宝沙箱环境,仅Android - * @param isSandBox - */ - static setAlipaySandbox(isSandBox) { - if (Platform.OS === 'android') - NativeModules.PutiPay.setAlipaySandbox(isSandBox); - } + /** + * 设置支付宝沙箱环境,仅Android + * @param isSandBox + */ + static setAlipaySandbox(isSandBox) { + if (Platform.OS === "android") + NativeModules.PutiPay.setAlipaySandbox(isSandBox); + } - /** + /** * 微信支付 * 传入参数示例 * { @@ -62,7 +59,7 @@ export default class XPay { * -1:原因:支付错误,可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等 * -2: 原因 用户取消,无需处理。发生场景:用户不支付了,点击取消,返回APP */ - static wxPay(params, callBack) { - NativeModules.PutiPay.wxPay(params, callBack) - } -} \ No newline at end of file + static wxPay(params, callBack) { + NativeModules.PutiPay.wxPay(params, callBack); + } +} diff --git a/ios/AlipaySDK.bundle/bridge.js b/ios/AlipaySDK.bundle/bridge.js old mode 100755 new mode 100644 index c3d3c21..0d37a94 --- a/ios/AlipaySDK.bundle/bridge.js +++ b/ios/AlipaySDK.bundle/bridge.js @@ -1 +1 @@ -(function(){if(window.AlipayJSBridge){return}function alipayjsbridgeFunc(url){var iframe=document.createElement("iframe");iframe.style.width="1px";iframe.style.height="1px";iframe.style.display="none";iframe.src=url;document.body.appendChild(iframe);setTimeout(function(){document.body.removeChild(iframe)},100)}window.alipayjsbridgeSetTitle=function(title){document.title=title;alipayjsbridgeFunc("alipayjsbridge://setTitle?title="+encodeURIComponent(title))};window.alipayjsbridgeRefresh=function(){alipayjsbridgeFunc("alipayjsbridge://onRefresh?")};window.alipayjsbridgeBack=function(){alipayjsbridgeFunc("alipayjsbridge://onBack?")};window.alipayjsbridgeExit=function(bsucc){alipayjsbridgeFunc("alipayjsbridge://onExit?bsucc="+bsucc)};window.alipayjsbridgeShowBackButton=function(bshow){alipayjsbridgeFunc("alipayjsbridge://showBackButton?bshow="+bshow)};window.AlipayJSBridge={version:"2.0",addListener:addListener,hasListener:hasListener,callListener:callListener,callNativeFunc:callNativeFunc,callBackFromNativeFunc:callBackFromNativeFunc};var uniqueId=1;var h5JsCallbackMap={};function iframeCall(paramStr){var iframe=document.createElement("iframe");iframe.style.width="1px";iframe.style.height="1px";iframe.style.display="none";iframe.src="alipayjsbridge://callNativeFunc?"+paramStr;var parent=document.body||document.documentElement;parent.appendChild(iframe);setTimeout(function(){parent.removeChild(iframe)},0)}function callNativeFunc(nativeFuncName,data,h5JsCallback){var h5JsCallbackId="";if(h5JsCallback){h5JsCallbackId="cb_"+(uniqueId++)+"_"+new Date().getTime();h5JsCallbackMap[h5JsCallbackId]=h5JsCallback}var dataStr="";if(data){dataStr=encodeURIComponent(JSON.stringify(data))}var paramStr="func="+nativeFuncName+"&cbId="+h5JsCallbackId+"&data="+dataStr;iframeCall(paramStr)}function callBackFromNativeFunc(h5JsCallbackId,data){var h5JsCallback=h5JsCallbackMap[h5JsCallbackId];if(h5JsCallback){h5JsCallback(data);delete h5JsCallbackMap[callbackId]}}var h5ListenerMap={};function addListener(jsFuncName,jsFunc){h5ListenerMap[jsFuncName]=jsFunc}function hasListener(jsFuncName){var jsFunc=h5ListenerMap[jsFuncName];if(!jsFunc){return false}return true}function callListener(h5JsFuncName,data,nativeCallbackId){var responseCallback;if(nativeCallbackId){responseCallback=function(responseData){var dataStr="";if(responseData){dataStr=encodeURIComponent(JSON.stringify(responseData))}var paramStr="func=h5JsFuncCallback"+"&cbId="+nativeCallbackId+"&data="+dataStr;iframeCall(paramStr)}}var h5JsFunc=h5ListenerMap[h5JsFuncName];if(!h5JsFunc){console.log("AlipayJSBridge: no h5JsFunc ",h5JsFuncName+data)}else{h5JsFunc(data,responseCallback)}}var event;if(window.CustomEvent){event=new CustomEvent("alipayjsbridgeready")}else{event=document.createEvent("Event");event.initEvent("alipayjsbridgeready",true,true)}document.dispatchEvent(event);setTimeout(excuteH5InitFuncs,0);function excuteH5InitFuncs(){if(window.AlipayJSBridgeInitArray){var h5InitFuncs=window.AlipayJSBridgeInitArray;delete window.AlipayJSBridgeInitArray;for(var i=0;i + +@class AFServiceResponse; + +/** + SDK支持的业务枚举值 + + - AFServiceEInvoice: 电子发票 + - AFServiceAuth: 账户授权 + */ +typedef NS_ENUM(NSUInteger, AFService) { + AFServiceEInvoice, + AFServiceAuth, + AFServiceDeduct +}; + + +extern NSString * const kAFServiceOptionBizParams; // 钱包服务调用入参 +extern NSString * const kAFServiceOptionCallbackScheme; // 业务回跳当前app的scheme +extern NSString * const kAFServiceOptionNotUseLanding; // 不使用支付宝提示下载页做补偿,为true时需要商户自己处理用户未安装支付宝的情况 +extern NSString * const kAFServiceBizParamsKeyUrl; // 独立签约入参url + +typedef void(^AFServiceResultBlock)(AFServiceResponse *response); + +@interface AFServiceCenter : NSObject + +/** + 调用钱包服务 + + @param service 业务service, 见AFService枚举值 + @param params 参数Dictionary, key值详情参见kAFServiceOptionBizParams、kAFServiceOptionCallbackScheme注释 + @param block 业务结果回调的block, block参数是AFServiceResponse类型,业务结果通过result属性获取,如果未用户未安装支付宝并且kAFServiceOptionNotUseLanding未设置为true,会使用H5landing页做补偿,这种情况下不会有block回调结果。 + */ ++ (void)callService:(AFService)service + withParams:(NSDictionary *)params + andCompletion:(AFServiceResultBlock)block; + + +/** + 处理钱包服务回跳APP的URL + + @param url 回跳URL + @param block 业务结果回掉的block,详情见调用接口入参上的block。注意此接口上的block只有在跳转钱包后,当前APP被系统回收的情况下回跳才生效 + */ ++ (void)handleResponseURL:(NSURL *)url + withCompletion:(AFServiceResultBlock)block; + +@end diff --git a/ios/AlipaySDK.framework/Headers/AFServiceResponse.h b/ios/AlipaySDK.framework/Headers/AFServiceResponse.h new file mode 100644 index 0000000..801fbf8 --- /dev/null +++ b/ios/AlipaySDK.framework/Headers/AFServiceResponse.h @@ -0,0 +1,43 @@ +// +// AFServiceResponse.h +// AFServiceSDK +// +// Created by jiajunchen on 08/01/2018. +// Copyright © 2018 antfin. All rights reserved. +// + +#import + +/** + 钱包服务调用结果状态吗 + + - AFResSuccess: 默认值,业务调用成功,结果数据参见result字段 + - AFResInvalidService: service枚举值错误 + - AFResInvalidURL: 钱包回跳URL错误 + - AFResRepeatCall: 业务重复调用(3s内) + - AFResOpenURLErr: 跳转失败 + */ +typedef NS_ENUM(NSUInteger, AFResCode) { + AFResSuccess = 0, + AFResInvalidService = 100, + AFResInvalidURL, + AFResRepeatCall, + AFResOpenURLErr, +}; + + +@interface AFServiceResponse : NSObject + + +/** + 业务调用状态吗 + */ +@property (nonatomic, assign) AFResCode responseCode; + + +/** + 业务结果Dictionary, 内容请参考具体业务方接入文档 + */ +@property (readonly) NSDictionary *result; + +@end diff --git a/ios/AlipaySDK.framework/Headers/AlipaySDK.h b/ios/AlipaySDK.framework/Headers/AlipaySDK.h index 6b3f762..27dc781 100644 --- a/ios/AlipaySDK.framework/Headers/AlipaySDK.h +++ b/ios/AlipaySDK.framework/Headers/AlipaySDK.h @@ -9,11 +9,13 @@ //////////////////////////////////////////////////////// ///////////////// 支付宝标准版本支付SDK /////////////////// -/////////// version:15.5.9 motify:2018.11.26/////////// +///////// version:15.8.03 motify:2021.04.29/////////// //////////////////////////////////////////////////////// #import #import "APayAuthInfo.h" +#import "AFServiceCenter.h" +#import "AFServiceResponse.h" typedef void(^CompletionBlock)(NSDictionary *resultDic); @@ -99,8 +101,8 @@ typedef enum { * * @param infoStr 授权请求信息字串 * @param schemeStr 调用授权的app注册在info.plist中的scheme - * @param completionBlock 授权结果回调,若在授权过程中,调用方应用被系统终止,则此block无效, - 需要调用方在appDelegate中调用processAuth_V2Result:standbyCallback:方法获取授权结果 + * @param completionBlock 授权结果回调,需要调用方在appDelegate中调用processAuth_V2Result:standbyCallback:方法获取授权结果 + * 若在授权过程中,调用方应用被系统终止则此block无效(此时会调用'processAuth_V2Result:standbyCallback:'传入的standbyCallback) */ - (void)auth_V2WithInfo:(NSString *)infoStr fromScheme:(NSString *)schemeStr @@ -110,7 +112,7 @@ typedef enum { * 处理支付宝app授权后跳回商户app携带的授权结果Url * * @param resultUrl 支付宝app返回的授权结果url - * @param completionBlock 授权结果回调 + * @param completionBlock 授权结果回调,用于处理跳转支付宝授权过程中商户APP被系统终止的情况 */ - (void)processAuth_V2Result:(NSURL *)resultUrl standbyCallback:(CompletionBlock)completionBlock; @@ -200,4 +202,22 @@ typedef enum { * @param block 更新请求结果回调 */ - (void)fetchSdkConfigWithBlock:(void(^)(BOOL success))block; + + +typedef void(^APLogBlock)(NSString *log); + +/** +* 接收AlipaySDK的log信息 +* +* @param logBlock 打印log的回调block +*/ ++ (void)startLogWithBlock:(APLogBlock)logBlock; + +/** +* 停止输出log,会释放logBlock +* +* +*/ ++ (void)stopLog; + @end diff --git a/package.json b/package.json index 6ff4f8e..796a4cc 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "1.4.0", "description": "微信和支付宝支付的react-native模块", "main": "index.js", + "types": "index.d.ts", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" },