一、參照文檔
微信支付官網-文檔中心-API文檔-開發文檔(V2版)-APP支付
二、打一個項目正式包,用來生成應用簽名
應用簽名工具下載
在測試機中同時安裝 項目正式包 和 應用簽名工具
在應用簽名工具中輸入該應用的包名,生成應用簽名
應用簽名 和 應用包名 都在 微信開放平臺申請開發應用 時需要用到
注意:如果不是正式包,可能導致上架發佈後不可用,因爲測試包和正式包生成的應用簽名可能不一致
三、導入微信SDK
在 build.gradle 的 dependencies 中導入,如下:
dependencies {
//……
//微信支付-Android Studio環境下:已改用gradle形式,發佈到jcenter,請開發者使用gradle來編譯、更新微信SDK。
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}
四、實現支付回調
新建一個 wxapi 包,在包內創建 WXPayEntryActivity ,代碼如下:
package 你的包名.wxapi;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import com.tencent.mm.opensdk.constants.ConstantsAPI;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import com.xolo.water.data.Constants;
import com.xolo.water.utils.ToastUitl;
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq req) {
}
@Override
public void onResp(BaseResp resp) {
/*
0 支付成功
-1 發生錯誤 可能的原因:簽名錯誤、未註冊APPID、項目設置APPID不正確、註冊的APPID與設置的不匹配、其他異常等。
-2 用戶取消 發生場景:用戶不支付了,點擊取消,返回APP。
*/
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
// 根據返回碼
int code = resp.errCode;
//發送廣播通知頁面支付結果
System.out.println("-------------code"+code);
Intent intent=new Intent("wechat.pay.Broadcast");
intent.putExtra("message", code);
sendBroadcast(intent);
switch (code) {
case 0:
// 去本地確認支付結果
ToastUitl.showShort("支付完成");
finish();
break;
case -2:
ToastUitl.showShort("支付已取消");
finish();
break;
default:
ToastUitl.showShort("支付失敗");
finish();
break;
}
}
}
}
在 AndroidManifest.xml 註冊微信回調 Activity 代碼如下:
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTop"
android:theme="@android:style/Theme.Translucent" />
五、微信支付代碼
1、創建一個 WeChatPay 工具類,代碼如下:
import android.content.Context;
import com.tencent.mm.opensdk.modelpay.PayReq;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
public class WeChatPay {
/**
* 當前項目在微信開放平臺審覈通過的appID
*/
public static final String WX_APP_ID = "你的APPID";
private static IWXAPI iwxapi;
private static Context context;
/**
* 註冊(微信)
*/
public static void regToWX(Context context) {
WeChatPay.context = context;
iwxapi = WXAPIFactory.createWXAPI(context, WX_APP_ID, true);
iwxapi.registerApp(WX_APP_ID);
}
/**
* 微信支付
* @param
*/
public static boolean getWXIshar(String appId,
String partnerId,
String prepayId,
String nonceStr,
String timeStamp,
String sign) {
/*System.out.println("---------appId" + appId);
System.out.println("---------partnerId" + partnerId);
System.out.println("---------prepayId" + prepayId);
System.out.println("---------nonceStr" + nonceStr);
System.out.println("---------timeStamp" + timeStamp);
System.out.println("---------sign" + sign);*/
System.out.println("getWXIshar" + appId + " " + partnerId + " " + prepayId + " " + nonceStr + " " + timeStamp + " " + sign);
if (iwxapi == null) {
iwxapi = WXAPIFactory.createWXAPI(context, WX_APP_ID, true);
}
PayReq request = new PayReq();
request.appId = WX_APP_ID;
request.partnerId = partnerId;// 微信支付分配的商戶號
request.prepayId = prepayId;// 預支付訂單號,app服務器調用“統一下單”接口獲取
request.packageValue = "Sign=WXPay";// 固定值Sign=WXPay,可以直接寫死,服務器返回的也是這個固定值
request.nonceStr = nonceStr;// 隨機字符串,不長於32位
request.timeStamp = timeStamp;// 時間戳
request.sign = sign;// 簽名,
return iwxapi.sendReq(request);
}
}
2、實現微信支付,代碼如下:
private WeChatBroadcastReceiver weChatBroadcastReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pay);
ButterKnife.bind(this);
tvTitle.setText("選擇支付");
//註冊微信支付
WeChatPay.regToWX(PayActivity.this);
weChatBroadcastReceiver = new WeChatBroadcastReceiver();
// 動態註冊廣播接受者
IntentFilter intentFilter = new IntentFilter();
//要接收的廣播-標識
intentFilter.addAction("wechat.pay.Broadcast");
registerReceiver(weChatBroadcastReceiver, intentFilter);
}
//調起微信支付-數據從後臺請求獲取
//weChatModel 就是後臺返回的數據,這裏根據實際情況輸入
boolean wxJg = WeChatPay.getWXIshar(
weChatModel.getAppid(),
weChatModel.getPartnerid(),
weChatModel.getPrepayid(),
weChatModel.getNoncestr(),
weChatModel.getTimestamp(),
weChatModel.getSign());
if (!wxJg) {
ToastUitl.showShort("請先安裝微信");
}
3、實現動態廣播,接收微信支付結果:
/**
* 自定義一個廣播,接收微信支付結果
*/
public class WeChatBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
QpadProgressUtils.closeProgress();
int msg = intent.getIntExtra("message", 0);
switch (msg) {
case 0:
// 支付成功,支付結果處理
break;
case -2:
ToastUitl.showShort("支付已取消" + msg);
break;
default:
ToastUitl.showShort("支付失敗" + msg);
break;
}
}
}