編輯:關於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;
Map resultunifiedorder;
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。
android學習四(Activity的生命周期)
要學好活動(Activity),就必須要了解android中Activity的聲明周期,靈活的使用生命周期,可以開發出更好的程序,在android中是使用任務來管理活動的
Android中ProgressDialog的簡單示例
網上一般對進度條的示例都是如何顯示,沒有在任務結束如何關閉的文章,參考其他文章經過試驗之後把整套進度條顯示的簡單示例如下: 建立an
opengles繪制紋理(一)
矩陣變換類package test.com.opengles7_1;import android.opengl.Matrix;/** * Created by hbin
Android歷史與版本變遷
0 史前階段: Android操作系統最早的一個版本是2007年11月5日發布的Android beta,作為一個面向開發者的軟件開發