├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── cuieney │ │ └── android │ │ └── rxpay │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── cuieney │ │ │ └── android │ │ │ └── rxpay │ │ │ ├── JavaSampleActivity.java │ │ │ ├── KotlinSampleActivity.kt │ │ │ └── RxPayApplication.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── cuieney │ └── android │ └── rxpay │ └── ExampleUnitTest.kt ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── img ├── logo.png ├── myWechat.png ├── ssh_adb.sh └── wechat.png ├── rxpay-annotation ├── .gitignore ├── build.gradle ├── mavenpush.gradle └── src │ └── main │ └── java │ └── com │ └── cuieney │ └── rxpay_annotation │ └── WX.kt ├── rxpay-api ├── .gitignore ├── build.gradle ├── build │ ├── generated │ │ └── source │ │ │ ├── buildConfig │ │ │ └── debug │ │ │ │ └── com │ │ │ │ └── cuieney │ │ │ │ └── sdk │ │ │ │ └── rxpay │ │ │ │ └── BuildConfig.java │ │ │ └── r │ │ │ └── debug │ │ │ └── com │ │ │ └── cuieney │ │ │ └── sdk │ │ │ └── rxpay │ │ │ └── R.java │ └── intermediates │ │ ├── bundles │ │ └── debug │ │ │ ├── R.txt │ │ │ └── res │ │ │ └── values │ │ │ └── values.xml │ │ ├── incremental │ │ ├── compileDebugAidl │ │ │ └── dependency.store │ │ └── packageDebugResources │ │ │ ├── compile-file-map.properties │ │ │ ├── merged.dir │ │ │ └── values │ │ │ │ └── values.xml │ │ │ └── merger.xml │ │ └── manifests │ │ └── aapt │ │ └── debug │ │ └── AndroidManifest.xml ├── libs │ └── alipaySdk-20180601.jar ├── mavenpush.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── cuieney │ │ └── sdk │ │ └── rxpay │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── cuieney │ │ │ └── sdk │ │ │ └── rxpay │ │ │ ├── PayWay.kt │ │ │ ├── PaymentStatus.kt │ │ │ ├── RxBus.kt │ │ │ ├── RxPay.kt │ │ │ ├── alipay │ │ │ ├── AlipayWay.kt │ │ │ └── PayResult.kt │ │ │ └── wechatpay │ │ │ ├── NameValuePair.kt │ │ │ └── WXPayWay.kt │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── cuieney │ └── sdk │ └── rxpay │ └── ExampleUnitTest.java ├── rxpay-compile ├── .gitignore ├── build.gradle ├── mavenpush.gradle └── src │ └── main │ ├── java │ └── com │ │ └── cuieney │ │ └── rxpay_compile │ │ ├── Constant.kt │ │ ├── GenerateWXActivityHelper.kt │ │ └── WxPayActivityProcessor.kt │ └── resources │ └── META-INF │ └── services │ └── javax.annotation.processing.Processor ├── settings.gradle └── wechat.png /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | /.idea 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![](img/logo.png) 2 | 3 | ## What's RxPay ? 4 | 5 | **让支付从此简单下去,一键支付功能,支持支付宝支付,微信支付** 6 | 7 | #### 集成步骤 8 | 9 | > Java 项目配置 10 | 11 | ``` 12 | dependencies { 13 | compile 'com.cuieney:rxpay-api:2.2.3' 14 | annotationProcessor 'com.cuieney:rxpay-compiler:2.1.1' 15 | //如果你项目配置了kotlin请忽略下面这行的配置 16 | //否则会报错 Failed resolution of: Lkotlin/jvm/internal/Intrinsics 17 | compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" 18 | } 19 | ``` 20 | 21 | > Kotlin 项目配置 22 | 23 | ``` 24 | apply plugin: 'kotlin-kapt' 25 | 26 | dependencies { 27 | compile 'com.cuieney:rxpay-api:2.2.3' 28 | kapt 'com.cuieney:rxpay-compiler:2.1.1' 29 | } 30 | ``` 31 | 32 | ### 添加权限 33 | ``` 34 | 35 | 36 | 37 | 38 | 39 | ``` 40 | 41 | ### 支付宝 42 | 43 | > 清单文件注册支付宝相关 Activity 44 | 45 | ``` 46 | 47 | 53 | 59 | ``` 60 | 61 | > 发起支付宝支付 62 | 63 | ``` 64 | new RxPay(this) 65 | .requestAlipay("服务器产生的订单信息") 66 | .subscribe(new Consumer() { 67 | @Override 68 | public void accept(Boolean aBoolean) throws Exception { 69 | payState.setText("阿里支付状态:"+aBoolean); 70 | } 71 | }, new Consumer() { 72 | @Override 73 | public void accept(Throwable throwable) throws Exception { 74 | payState.setText("阿里支付状态:"+throwable.getMessage()); 75 | } 76 | }); 77 | ``` 78 | 79 | #### 微信 80 | 81 | > 在 Application 类中添加支付节点 82 | 83 | ``` 84 | @WX(packageName = "微信支付注册keystore时候的包名") 85 | public class XXApplication extends Application { 86 | 87 | } 88 | ``` 89 | 90 | > 在AndroidManifest添加你微信支付的appid 和PARTNER_ID商户号(固定不变的),apiKey(商户平台设置的密钥key获取方法,可以问后台要可以到微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置) 91 | 92 | ``` 93 | 94 | 97 | 98 | 99 | 102 | 103 | 104 | 107 | ``` 108 | 109 | > 在清单文件中注册微信相关的Activity,添加完之后会报错,使用 ReBuild 或者重新运行就不会了,这个 Activity 会被自动生成 110 | 111 | ``` 112 | 117 | ``` 118 | 119 | > 发起微信支付 120 | 121 | ``` 122 | new RxPay(this) 123 | .requestWXpay(("服务器生成订单的后拼接成下面这种json字符串")) 124 | .subscribe(new Consumer() { 125 | @Override 126 | public void accept(Boolean aBoolean) throws Exception { 127 | payState.setText("微信支付状态:"+aBoolean); 128 | } 129 | }, new Consumer() { 130 | @Override 131 | public void accept(Throwable throwable) throws Exception { 132 | payState.setText("微信支付状态:"+throwable.getMessage()); 133 | } 134 | }); 135 | ``` 136 | 137 | > 对应的json格式参考 138 | 139 | ``` 140 | 1.格式一(Manifest三个参数全设置了) 141 | { 142 |   "prepayId": "必填项", 143 | } 144 | 2.格式二(Manifest设置了PARTNER_ID 没有设置API_KEY) 145 | { 146 |    "nonceStr": "必填项", 147 | "partnerId": "必填项", 148 | "packageValue": "必填项", 149 | "prepayId": "必填项", 150 |    "sign": "必填项", 151 | "timeStamp": "必填项" 152 | } 153 | ``` 154 | 155 | [示例代码](app/src/main/java/com/cuieney/android/rxpay) 156 | 157 | #### 混淆规则 158 | 159 | ``` 160 | -keep class com.alipay.android.app.IAlixPay{*;} 161 | -keep class com.alipay.android.app.IAlixPay$Stub{*;} 162 | -keep class com.alipay.android.app.IRemoteServiceCallback{*;} 163 | -keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;} 164 | -keep class com.alipay.sdk.app.PayTask{ public *;} 165 | -keep class com.alipay.sdk.app.AuthTask{ public *;} 166 | -keep class com.alipay.sdk.app.H5PayCallback { 167 | ; 168 | ; 169 | } 170 | -keep class com.alipay.android.phone.mrpc.core.** { *; } 171 | -keep class com.alipay.apmobilesecuritysdk.** { *; } 172 | -keep class com.alipay.mobile.framework.service.annotation.** { *; } 173 | -keep class com.alipay.mobilesecuritysdk.face.** { *; } 174 | -keep class com.alipay.tscenter.biz.rpc.** { *; } 175 | -keep class org.json.alipay.** { *; } 176 | -keep class com.alipay.tscenter.** { *; } 177 | -keep class com.ta.utdid2.** { *;} 178 | -keep class com.ut.device.** { *;} 179 | 180 | -dontwarn com.alipay.** 181 | ``` 182 | #### 其他问题 183 | 184 | * 对于调起微信支付的json的字段请参考以上的json 185 | 186 | * 以下的过度版本可以解决依赖包冲突问题 187 | 188 | * com.cuieney:rxpay-api:**2.1.11** 版本 **阿里jar包 微信依赖** **都已剔除** 189 | 190 | * com.cuieney:rxpay-api:**2.1.12** 版本**只剔除 阿里jar包** 191 | 192 | * com.cuieney:rxpay-api:**2.2.2** 版本**只剔除 微信依赖** 193 | 194 | * 如果项目中还有Rxjava版本1的话为了防止代码冲突 请在build.gradle里面添加一下代码 195 | 196 | ``` 197 | packagingOptions { 198 | exclude 'META-INF/rxjava.properties' 199 | } 200 | ``` 201 | 202 | #### 问题 203 | 204 | 发现bug或好的建议欢迎 [issues](https://github.com/Cuieney/RxPay/issues) or 205 | Email 206 | 207 | ### License 208 | 209 | ``` 210 | Copyright 2017 Cuieney 211 | 212 | Licensed under the Apache License, Version 2.0 (the "License"); 213 | you may not use this file except in compliance with the License. 214 | You may obtain a copy of the License at 215 | 216 | http://www.apache.org/licenses/LICENSE-2.0 217 | 218 | Unless required by applicable law or agreed to in writing, software 219 | distributed under the License is distributed on an "AS IS" BASIS, 220 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 221 | See the License for the specific language governing permissions and 222 | limitations under the License. 223 | ``` 224 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | apply plugin: 'kotlin-android' 4 | 5 | apply plugin: 'kotlin-android-extensions' 6 | apply plugin: 'kotlin-kapt' 7 | android { 8 | compileSdkVersion 26 9 | defaultConfig { 10 | applicationId "com.cuieney.android.rxpay" 11 | minSdkVersion 15 12 | targetSdkVersion 26 13 | versionCode 1 14 | versionName "1.0" 15 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 16 | } 17 | buildTypes { 18 | release { 19 | minifyEnabled false 20 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 21 | } 22 | } 23 | } 24 | 25 | dependencies { 26 | implementation fileTree(include: ['*.jar'], dir: 'libs') 27 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" 28 | implementation 'com.android.support:appcompat-v7:26.0.0-beta1' 29 | implementation 'com.android.support.constraint:constraint-layout:1.0.2' 30 | testImplementation 'junit:junit:4.12' 31 | androidTestImplementation 'com.android.support.test:runner:0.5' 32 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:2.2.2' 33 | 34 | // api('com.cuieney:rxpay-api:2.1.8') 35 | // kapt 'com.cuieney:rxpay-compiler:2.1.1' 36 | 37 | api project(':rxpay-api') 38 | kapt project(':rxpay-compile') 39 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/cuieney/android/rxpay/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.cuieney.android.rxpay 2 | 3 | import android.support.test.InstrumentationRegistry 4 | import android.support.test.runner.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getTargetContext() 22 | assertEquals("com.cuieney.android.rxpay", appContext.packageName) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 28 | 29 | 32 | 35 | 36 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/cuieney/android/rxpay/JavaSampleActivity.java: -------------------------------------------------------------------------------- 1 | package com.cuieney.android.rxpay; 2 | 3 | import android.os.Bundle; 4 | import android.os.Handler; 5 | import android.support.annotation.Nullable; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.util.Log; 8 | import android.view.View; 9 | 10 | import com.cuieney.rxpay_annotation.WX; 11 | import com.cuieney.sdk.rxpay.RxPay; 12 | 13 | import org.json.JSONException; 14 | import org.json.JSONObject; 15 | 16 | import io.reactivex.disposables.Disposable; 17 | import io.reactivex.functions.Consumer; 18 | import io.reactivex.schedulers.Schedulers; 19 | 20 | public class JavaSampleActivity extends AppCompatActivity { 21 | @Override 22 | protected void onCreate(@Nullable Bundle savedInstanceState) { 23 | super.onCreate(savedInstanceState); 24 | setContentView(R.layout.activity_main); 25 | findViewById(R.id.ali). 26 | setOnClickListener(new View.OnClickListener() { 27 | @Override 28 | public void onClick(View view) { 29 | alipay(); 30 | } 31 | }); 32 | 33 | findViewById(R.id.wechat).setOnClickListener(new View.OnClickListener() { 34 | @Override 35 | public void onClick(View view) { 36 | wechatPay(); 37 | } 38 | }); 39 | new Handler(); 40 | } 41 | 42 | void alipay() { 43 | //服务器产生的订单信息 44 | String str = "partner=\"2088121059329235\"&seller_id=\"1993349866@qq.com\"&out_trade_no=\"XGJ_LIVE20171130142905-440402\"&subject=\"一对一收费单节\"&body=\"一对一收费单节\"&total_fee=\"0.01\"¬ify_url=\"http://new.antwk.com/api/order/alipayNotify\"&service=\"mobile.securitypay.pay\"&payment_type=\"1\"&_input_charset=\"utf-8\"&it_b_pay=\"1757281m\"&return_url=\"m.alipay.com\"&sign=\"vn%2Fw5wJAYSdP5rtQxumnAXPaaidyeVOluEoDlvS4axezmvfpoIHzwxj5pqNrJ5NMKq7NK8krHWBo8Z6jeTkFbCb2mvLbyBicAjDz02WyPOmKM%2F%2FGRfqfDlX4Q0T06PQmipNFVD3UPHrwPQbHG3eeWobqBFG0jcu%2FtnMZrsZvzso%3D\"&sign_type=\"RSA\""; 45 | 46 | new RxPay(this).requestAlipay(str) 47 | 48 | .subscribe(new Consumer() { 49 | @Override 50 | public void accept(Boolean aBoolean) throws Exception { 51 | 52 | Log.e("oye", "accept: " + aBoolean); 53 | } 54 | }, new Consumer() { 55 | @Override 56 | public void accept(Throwable throwable) throws Exception { 57 | Log.e("oye", "accept: ", throwable); 58 | } 59 | }); 60 | } 61 | 62 | void wechatPay() { 63 | //服务器生成订单后的json 具体看README格式 64 | String str = "{\"prepayId\":\"wx20171130142918877d249e440347896475\"}"; 65 | new RxPay(this).requestWXpay( 66 | str) 67 | .subscribe(new Consumer() { 68 | @Override 69 | public void accept(Boolean aBoolean) throws Exception { 70 | Log.e("oye", "accept: " + aBoolean); 71 | } 72 | }, new Consumer() { 73 | @Override 74 | public void accept(Throwable throwable) throws Exception { 75 | Log.e("oye", "accept: ", throwable); 76 | } 77 | }); 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /app/src/main/java/com/cuieney/android/rxpay/KotlinSampleActivity.kt: -------------------------------------------------------------------------------- 1 | package com.cuieney.android.rxpay 2 | 3 | import android.support.v7.app.AppCompatActivity 4 | import android.os.Bundle 5 | import android.util.Log 6 | import android.view.View 7 | import com.cuieney.rxpay_annotation.WX 8 | import com.cuieney.sdk.rxpay.RxPay 9 | import org.json.JSONException 10 | import org.json.JSONObject 11 | 12 | class KotlinSampleActivity : AppCompatActivity() { 13 | 14 | override fun onCreate(savedInstanceState: Bundle?) { 15 | super.onCreate(savedInstanceState) 16 | setContentView(R.layout.activity_main) 17 | findViewById(R.id.ali).setOnClickListener { 18 | alipay() 19 | } 20 | findViewById(R.id.wechat).setOnClickListener { 21 | wechatPay() 22 | } 23 | } 24 | 25 | 26 | fun alipay() { 27 | //服务器产生的订单信息 28 | var str = "partner=\"2088121059329235\"&seller_id=\"1993349866@qq.com\"&out_trade_no=\"XGJ_LIVE20171130142905-440402\"&subject=\"一对一收费单节\"&body=\"一对一收费单节\"&total_fee=\"0.01\"¬ify_url=\"http://new.antwk.com/api/order/alipayNotify\"&service=\"mobile.securitypay.pay\"&payment_type=\"1\"&_input_charset=\"utf-8\"&it_b_pay=\"1757281m\"&return_url=\"m.alipay.com\"&sign=\"vn%2Fw5wJAYSdP5rtQxumnAXPaaidyeVOluEoDlvS4axezmvfpoIHzwxj5pqNrJ5NMKq7NK8krHWBo8Z6jeTkFbCb2mvLbyBicAjDz02WyPOmKM%2F%2FGRfqfDlX4Q0T06PQmipNFVD3UPHrwPQbHG3eeWobqBFG0jcu%2FtnMZrsZvzso%3D\"&sign_type=\"RSA\"" 29 | RxPay(this).requestAlipay(str) 30 | .subscribe({ aBoolean -> 31 | Log.e("oye", "accept: " + aBoolean!!) 32 | }) { throwable -> 33 | Log.e("oye", "accept: ", throwable) 34 | } 35 | 36 | } 37 | 38 | fun wechatPay() { 39 | //"服务器生成订单后的json 具体看README格式" 40 | var str = "{\"prepayId\":\"wx20171130142918877d249e440347896475\"}" 41 | RxPay(this).requestWXpay(str) 42 | .subscribe({ aBoolean -> 43 | Log.e("oye", "accept: " + aBoolean!!) 44 | }) { throwable -> 45 | Log.e("oye", "accept: ", throwable) 46 | } 47 | 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/com/cuieney/android/rxpay/RxPayApplication.java: -------------------------------------------------------------------------------- 1 | package com.cuieney.android.rxpay; 2 | 3 | import android.app.Application; 4 | 5 | import com.cuieney.rxpay_annotation.WX; 6 | 7 | @WX(packageName = "com.cuieney.android.rxpay")//微信支付注册keystore时候的包名 8 | public class RxPayApplication extends Application { 9 | 10 | @Override 11 | public void onCreate() { 12 | super.onCreate(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 18 | 19 |