[微信支付] 簡單封裝
直奔主題
注意:需要了解整合的可以檢視demo,demo不能喚起支付或分享等功能,因為沒有配置appKey,只能用作程式碼參考。
1、微信支付、登入、分享工具類:WXApiHelper.java
/** * 微信SDK幫助類 */ public class WXApiHelper { private static final String WX_APP_ID = "wx666666";//TODO 微信相關 private static final String WX_APP_SECRET = "66666666666666666"; private static final String WX_SCOPE = "snsapi_userinfo"; private static final String WX_STATE = "sport_dict_wx_login"; private static final String WX_GRANT_TYPE = "authorization_code"; private static final String WX_PACKAGE_VALUE = "Sign=WXPay"; private static WXApiHelper mHelper; private final IWXAPI mWxApi; /** * APP.getInstance() 為Application的context */ private WXApiHelper() { mWxApi = WXAPIFactory.createWXAPI(APP.getInstance(), WX_APP_ID, false); mWxApi.registerApp(WX_APP_ID); } public static WXApiHelper get() { if (mHelper == null) { mHelper = new WXApiHelper(); } return mHelper; } /** * 微信登入 */ public void doWxLogin() { final SendAuth.Req req = new SendAuth.Req(); req.scope = WX_SCOPE; req.state = WX_STATE; mWxApi.sendReq(req); } /** * 微信支付 * * @param payInfo 支付相關資訊,需要從自己的伺服器獲取 */ public void doWxPay(PayInfo payInfo) { PayReq req = new PayReq(); req.appId = WX_APP_ID; req.partnerId = payInfo.getPartnerid(); req.prepayId = payInfo.getPrepayid(); req.nonceStr = payInfo.getNoncestr(); req.timeStamp = payInfo.getTimestamp(); req.packageValue = WX_PACKAGE_VALUE; req.sign = payInfo.getSign(); mWxApi.sendReq(req); } /** * 微信分享url給朋友 * * @param title 標題 * @param description 內容 * @param url 分享的url */ public void doShareUrlToWeChat(String title, String description, String url) { doShareUrl(title, description, url, SendMessageToWX.Req.WXSceneSession); } /** * 微信分享url到朋友圈 * @param title 標題 * @param description 內容 * @param url 分享的url */ public void doShareUrlToTimeline(String title, String description, String url) { doShareUrl(title, description, url, SendMessageToWX.Req.WXSceneTimeline); } private void doShareUrl(String title, String description, String url, int scene) { WXWebpageObject webpage = new WXWebpageObject(); webpage.webpageUrl = url; WXMediaMessage msg = new WXMediaMessage(webpage); msg.title = title; msg.description = description; //Bitmap thumbBmp = BitmapFactory.decodeResource(getResources(), R.drawable.send_music_thumb); //msg.thumbData = Util.bmpToByteArray(thumbBmp, true); SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = "webpage"; req.message = msg; req.scene = scene; //req.userOpenId = getOpenId(); mWxApi.sendReq(req); } //TODO 其他分享功能可以寫到這裡 public void handleIntent(Intent intent, IWXAPIEventHandler handler) { mWxApi.handleIntent(intent, handler); } }
2、實體類PayInfo.java
/** * 支付訂單資訊 (微信) */ public class PayInfo { //微信相關資訊 private String return_code;//返回代號 private String return_msg;// private String appid;//應用ID private String mch_id;// private String noncestr;//隨機字串 private String sign;//簽名 private String result_code;//結果代號 private String prepayid;//預支付交易會話ID private String trade_type;//交易型別 private String partnerid;//商戶號 private String timestamp;//時間戳 //Getter 和 setter 方法這裡就忽略不寫 }
3、呼叫
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } private void doWeChatPay() { final PayInfo payInfo = new PayInfo(); //TODO 實際的PayInfo需要調自己的伺服器獲取相關資訊 WXApiHelper.get().doWxPay(null); } private void doWeChatShare() { WXApiHelper.get().doShareUrlToWeChat("活動", "這是一個公益活動", "公益活動的網頁連結"); } private void doWeChatLogin() { WXApiHelper.get().doWxLogin(); } }
4、支付回撥WXPayEntryActivity.java
public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); WXApiHelper.get().handleIntent(getIntent(), this); } @Override public void onReq(BaseReq baseReq) { } @Override public void onResp(BaseResp baseResp) { final int type = baseResp.getType(); if (ConstantsAPI.COMMAND_PAY_BY_WX == type) { switch (baseResp.errCode) { case BaseResp.ErrCode.ERR_OK: //TODO 支付成功 break; case BaseResp.ErrCode.ERR_COMM: Toast.makeText(this, "支付發生錯誤", Toast.LENGTH_LONG).show(); finish(); break; case BaseResp.ErrCode.ERR_USER_CANCEL: Toast.makeText(this, "已取消", Toast.LENGTH_LONG).show(); finish(); break; default: Toast.makeText(this, "錯誤碼:" + baseResp.errCode, Toast.LENGTH_LONG).show(); finish(); break; } } } }
5、分享和登入回撥WXEntryActivity.java
public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); WXApiHelper.get().handleIntent(getIntent(), this); } @Override public void onReq(BaseReq baseReq) { } @Override public void onResp(BaseResp baseResp) { final int type = baseResp.getType(); if (ConstantsAPI.COMMAND_SENDAUTH == type) {//登入 switch (baseResp.errCode) { case BaseResp.ErrCode.ERR_OK: final String code = ((SendAuth.Resp) baseResp).code; getWxLoginInfo(code); break; case BaseResp.ErrCode.ERR_AUTH_DENIED: Toast.makeText(this, "拒絕授權微信登入", Toast.LENGTH_LONG).show(); finish(); break; case BaseResp.ErrCode.ERR_USER_CANCEL: Toast.makeText(this, "已取消", Toast.LENGTH_LONG).show(); finish(); break; default: Toast.makeText(this, "錯誤碼:" + baseResp.errCode, Toast.LENGTH_LONG).show(); finish(); break; } } else if (ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX == type) {//分享 finish(); } } private void getWxLoginInfo(String code) { //TODO 通過微信SDK返回的code,請求自己的伺服器獲取使用者資訊。 } }