編輯:關於Android編程
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
1.導入jar包 https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN
2.清單文件的配置
3.初始化的類 package com.lx.edu.wxapi; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import com.lx.edu.common.Constant; import com.tencent.mm.sdk.openapi.IWXAPI; import com.tencent.mm.sdk.openapi.WXAPIFactory; public class AppRegister extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { final IWXAPI api = WXAPIFactory.createWXAPI(context, null); api.registerApp(Constant.PAY_WX_APP_ID); } }
4.支付的調用類 package com.lx.edu; import java.util.Map; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.content.BroadcastReceiver; /** * * @項目名稱:LxeduComm * @類名稱:PaymentActivity * @類描述: 微信支付 * @創建人:sdh * @創建時間:2015-1-19下午3:05 * @version */ public class ServiceOrderActivity extends Activity implements OnClickListener { protected static final String TAG = "ServiceOrderActivity"; private Context mContext; private String selectPayment; private StringBuffer sb; private PayReq req; Mapresultunifiedorder; private RadioButton radiobtnWXPay; private RadioButton radiobtnAliPay; private String payInfo; private String outTradeNO; private SharedPreferencesUtil share; String sign; String partnerid; String noncestr; String package_str; String prepayid; String out_trade_no; String timestamp; //初始化微信的api對象 final IWXAPI msgApi = WXAPIFactory.createWXAPI(this, null); private Handler handler = new Handler(); private Runnable runnable = new Runnable() { public void run() { payResult(); handler.postDelayed(this, 5000); } }; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_payment); mContext = ServiceOrderActivity.this; init(); radiobtnAliPay.setChecked(true); // 注冊廣播 支付成功後發送了廣播 這裡進行接收 IntentFilter filter = new IntentFilter(); filter.addAction(Constant.ACTION_MESSAGE_WXPAY_SUCCESS); mContext.registerReceiver(receiver, filter); } private void init() { //注冊APPID 這裡的appid是注冊後拿到的 寫死在了配置文件裡面 msgApi.registerApp(Constant.PAY_WX_APP_ID); sb = new StringBuffer(); req = new PayReq(); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.btn_pay: getNetDataForWx(serviceInstId,studentId); break; default: break; } } //微信網絡接口調用 後面會貼出接口文檔 private void getNetDataForWx(String serviceInstId,String studentId){ final TranLoading loading = new TranLoading(mContext); loading.show(); RequestParams params = new RequestParams(); params.addBodyParameter(Constant.NET_USERID, share.getString(Constant.SP_USERID, "")); params.addBodyParameter(Constant.NET_TOKEN, share.getString(Constant.SP_TOKEN, " ")); params.addBodyParameter(Constant.NET_STUDENT_ID,studentId); params.addBodyParameter(Constant.NET_SERVICEINST_ID, serviceInstId); HttpUtils http = new HttpUtils(Constant.HTTP_TIME_OUT_LONG); http.send(HttpRequest.HttpMethod.POST, UrlUtis.SERVICE_ORDER_PAY_WX, params, new RequestCallBack () { @Override public void onSuccess(ResponseInfo responseInfo) { try { JSONObject jsonObject = new JSONObject( responseInfo.result); final String success = jsonObject .getString("success"); Log.e(TAG, jsonObject.toString()); JSONObject ob = new JSONObject(jsonObject .getString(Constant.NET_OBJ)); sign=ob.getString("sign"); partnerid=ob.getString("partnerid"); noncestr=ob.getString("noncestr"); package_str=ob.getString("package_str"); prepayid=ob.getString("prepayid"); out_trade_no=ob.getString("out_trade_no"); timestamp=ob.getString("timestamp"); if (Constant.NET_ALI_SUCCESS_TRUE.equals(success)) { payForWX(); } else if (Constant.NET_ALI_SUCCESS_FSLSE .equals(success)) { final String msg = jsonObject.getString("msg"); ViewUtil.shortToast(mContext, msg); } } catch (JSONException e) { e.printStackTrace(); } loading.dismiss(); } @Override public void onFailure(HttpException error, String msg) { loading.dismiss(); ViewUtil.shortToast(mContext, mContext.getString(R.string.error_net)); } }); } // 輪循接口 private void payResult() { final TranLoading loading = new TranLoading(mContext); loading.show(); RequestParams params = new RequestParams(); params.addBodyParameter(Constant.NET_OUTTRADENO, outTradeNO); params.addBodyParameter(Constant.NET_TOKEN, share.getString(Constant.SP_TOKEN, " ")); HttpUtils http = new HttpUtils(Constant.HTTP_TIME_OUT_LONG); http.send(HttpRequest.HttpMethod.POST, UrlUtis.SERVICE_ORDER_PAY_RESULT, params, new RequestCallBack () { @Override public void onSuccess(ResponseInfo responseInfo) { try { JSONObject jsonObject = new JSONObject( responseInfo.result); Log.d(TAG, jsonObject.toString()); JSONObject ob = new JSONObject(jsonObject .getString(Constant.NET_OBJ)); final String payStatus = ob .getString(Constant.NET_PAYSTATUS_RESULT); if (Constant.NET_PAYSTATUS_PAID.equals(payStatus)) { // 成功 handler.removeCallbacks(runnable); ViewUtil.shortToast(mContext, mContext .getString(R.string.pay_success)); } else if (Constant.NET_PAYSTATUS_FAIL .equals(payStatus)) { // 失敗 ViewUtil.shortToast(mContext, mContext .getString(R.string.pay_status_fails)); } else { // 支付中 ViewUtil.shortToast(mContext, mContext .getString(R.string.pay_be_sure)); } } catch (JSONException e) { e.printStackTrace(); } loading.dismiss(); } @Override public void onFailure(HttpException error, String msg) { loading.dismiss(); ViewUtil.shortToast(mContext, mContext.getString(R.string.error_net)); } }); } // 微信支付 private void payForWX() { IWXAPI api; api = WXAPIFactory.createWXAPI(this, Constant.PAY_WX_APP_ID); PayReq req = new PayReq(); req.appId = Constant.PAY_WX_APP_ID; req.partnerId = partnerid; req.prepayId = prepayid; req.nonceStr = noncestr; req.timeStamp = timestamp; req.packageValue = package_str; req.sign = sign; req.extData = "app data"; api.sendReq(req); } private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String wxPay=intent.getStringExtra(Constant.EXTRA_WXPAY); String action = intent.getAction(); if(Constant.ACTION_MESSAGE_WXPAY_SUCCESS.equals(action)&&Constant.EXTRA_WXPAY_SUCCESS.equals(wxPay)){ CommonUtils.getServiceData(mContext); ServiceOrderActivity.this.setResult(RESULT_OK, intent.putExtra( Constant.EXTRA_SERVICE_PAY_SUCCESS, Constant.EXTRA_SERVICE_PAY_SUCCESS_TRUE)); finish(); } } }; public void onDestroy() { if (mContext != null) { mContext.unregisterReceiver(receiver); } super.onDestroy(); } }
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxociAvPg0KPHByZSBjbGFzcz0="brush:java;">
5,支付回掉
package com.lx.edu.wxapi;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import com.lx.edu.R;
import com.lx.edu.common.Constant;
import com.lx.edu.common.Rules;
import com.lx.edu.common.ViewUtil;
import com.tencent.mm.sdk.constants.ConstantsAPI;
import com.tencent.mm.sdk.modelbase.BaseReq;
import com.tencent.mm.sdk.modelbase.BaseResp;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pay_result);
api = WXAPIFactory.createWXAPI(this, Constant.PAY_WX_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) {
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
if (resp.errCode == 0) {
//支付成功
ViewUtil.shortToast(WXPayEntryActivity.this, getString(R.string.pay_success));
Intent intent1 = new Intent();
intent1.setAction(Constant.ACTION_MESSAGE_WXPAY_SUCCESS);
intent1.putExtra(
Constant.EXTRA_WXPAY,Constant.EXTRA_WXPAY_SUCCESS);
sendBroadcast(intent1);
} else if (resp.errCode == -2) {
ViewUtil.shortToast(WXPayEntryActivity.this, getString(R.string.pay_fails));
}
else {
ViewUtil.shortToast(WXPayEntryActivity.this, getString(R.string.pay_status_fails));
}
WXPayEntryActivity.this.finish();
}
}
}
1.交互時序圖
WXEntryActivity這個回調界面實際上不會影響前面的調起支付的邏輯,這個Activity一定要放到“App包名.wxapi”的package中,否則無法響應回調, 當然別忘了在AndroidManifest.xml中注冊。(是根據反射找到的這個類)
首先如果要使用微信支付的話,必須先到微信開放平台注冊應用,具體地址為https://open.weixin.qq.com/,注冊時需要填應用的包名和簽名,注意 這裡的簽名是App正式版的簽名,可以找一個已上線的包或打一個正式包,使用微信提供的工具(簽名工具下載地址為https://open.weixin.qq.com/zh_CN /htmledition/res/dev/download/sdk/Gen_Signature_Android.apk)來獲取,獲取後填上即可。待審核通過後,會得到一個AppID和AppSecret,AppID 分享和支付都要用到,AppSecret沒什麼實際用途,此時微信分享能力是直接擁有的,支付能力還要額外申請,其中涉及到財務信息等,最好讓公司財務部門去申請, 申請成功後會拿到一個商戶id,後面生成sign時會用到。只有所有審核都通過後,才可調用微信支付功能,這點是前提。
測試微信支付時,務必對自己的App做正式簽名,因為一開始就在微信平台注冊過簽名信息,微信SDK會做校驗,只有這樣才能調起微信分享和微信支付,直接debug版的 包則絕對調不起來,這點務必注意,很多人是跌在這裡了!當初做微信分享曾遇到過,所以會很留心,也因為如此,如果微信分享能調起來,微信支付不行,那就不要懷 疑簽名問題了
還是簽名,網上有人說要注意大小寫,這點其實是不必的。在微信開放平台看到審核通過的App的簽名是大寫的,而用微信簽名獲取工具獲得的則顯示小寫,這個沒關系, 不要貿然改動平台注冊信息,不然又可能導致漫長的審核等待,上面也說了,微信分享如可以,那就不是簽名問題。
生成sign時特別需要注意,首先將key-value鍵值對拼成字符串,注意key都要小寫,如appid,noncestr,package,partnerid,prepayid,timestamp,key,並且名 字得按上述名稱,我們遇到的錯誤就是因為partnerid寫成了partnerId,prepayid寫成了PrepayId,當然我們是在服務端寫的,如果在客戶端生成sign的話,也需要注 意大小寫及名稱,詳細信息請參考官方文檔。還有這裡的key並非AppID或AppSectet,而是在商戶平台設置的,官方描述為“key設置路徑:微信商戶平台(pay.weixin.qq.com) >賬戶設置-->API安全-->密鑰設置”。對於noncestr,申請prepayid和生成sign時兩次需要用到
req.packageValue=”Sign=WXPay”,一般都是這樣寫死這個參數值。也有人說寫成req.packageValue=”prepay_id=” + prepayid,經測試Android兩種寫法都是可以 調起微信支付的,至少最新版本SDK是可以的,以後則不清楚,官方也建議寫Sign=WXPay。
要學好活動(Activity),就必須要了解android中Activity的聲明周期,靈活的使用生命周期,可以開發出更好的程序,在android中是使用任務來管理活動的
網上一般對進度條的示例都是如何顯示,沒有在任務結束如何關閉的文章,參考其他文章經過試驗之後把整套進度條顯示的簡單示例如下: 建立an
矩陣變換類package test.com.opengles7_1;import android.opengl.Matrix;/** * Created by hbin
0 史前階段: Android操作系統最早的一個版本是2007年11月5日發布的Android beta,作為一個面向開發者的軟件開發