2020 Android 微信支付

一、參照文檔
    微信支付官網-文檔中心-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;
            }
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章