1、準備工作
在微信開放平臺進行登記,登記並選擇移動應用進行設置後,將該應用提交審覈,只有審覈通過的應用才能進行開發。
微信支付的開發方式和支付寶不同,微信支付在客戶端不需要太多的操作,大多依賴於服務器端。
2、導入jar包
將libammsdk.jar包放入應用工程的libs目錄下。
3、修改AndroidManifest.xml文件
在AndroidManifest.xml文件中添加如下代碼:
<!-- ==================== 微信支付配置開始 ==================== -->
<activity
android:name="com.subzero.copass.wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop" />
<!-- ==================== 微信支付配置結束 ==================== -->
* 注意:添加啓動模式 android:launchMode=”singleTop”。
添加權限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
4、創建結果回調頁
pay_result.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#FFE1E8EB"
android:gravity="center_horizontal">
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:textColor="#ff000000"
android:textSize="20dp"
android:text="這個界面用於顯示第三方app通過微信支付的結果"/>
</LinearLayout>
5、支付結果回調類
需要注意的是這個類必須放在包名爲**.wxapi裏面。例:包名com.subzero.copass (com.subzero.copass .wxapi.WXPayEntryActivity),否則微信支付結果不會調用這個類來回調微信的支付結果。
微信支付回調的結果resp.errCode。
WXPayEntryActivity.java
/**
* 微信支付完成後回調onResp函數
* 此類必須放在包名.wxapi裏面。例:包名com.subzero.copass (com.subzero.copass .wxapi.WXPayEntryActivity);
*/
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pay_result);
//微信APP_ID
api = WXAPIFactory.createWXAPI(this, PayConfig.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) {
Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);
String msg = "";
if (resp.errCode == 0) {
msg = "支付成功";
} else if (resp.errCode == -1) {
msg = "已取消支付";
} else if (resp.errCode == -2) {
msg = "支付失敗";
}
Toast.makeText(WXPayEntryActivity.this, msg, Toast.LENGTH_SHORT).show();
finish();
}
}
6、調起支付
微信支付的步驟是先調用服務器接口,由服務器調用接口在微信支付服務後臺生成預支付交易單,返回正確的預支付交易回話標識後再在APP裏面調起支付。
微信支付需要手機安裝有微信的客戶端。如果沒有安裝微信客戶端,無法調起支付。
api.sendReq(req);發送請求或發送響應到微信終端,可以通過IWXAPI的 sendReq 和 sendResp 兩個方法來實現。
此接口爲微信官方測試接口。實際的微信支付功能請您在支付時調起應用後臺的接口獲取相應數據並使用api.sendReq(req);方法調起微信支付。
private IWXAPI api; // IWXAPI 是第三方app和微信通信的openapi接口
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pay);
//微信appId
api = WXAPIFactory.createWXAPI(context, PayConfig.APP_ID);
Button appayBtn = (Button) findViewById(R.id.appay_btn);
appayBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url = "http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=android;
Toast.makeText(PayActivity.this, "獲取訂單中...", Toast.LENGTH_SHORT).show();
try{
byte[] buf = Util.httpGet(url);
if (buf != null && buf.length > 0) {
String content = new String(buf);
Log.e("get server pay params:",content);
JSONObject json = new JSONObject(content);
if(null != json && !json.has("retcode") ){
PayReq req = new PayReq();
//req.appId = "wxf8b4f85f3a794e77"; // 測試用appId
//從服務器獲取
req.appId = json.getString("appid");
req.partnerId = json.getString("partnerid");
req.prepayId = json.getString("prepayid");
req.nonceStr = json.getString("noncestr");
req.timeStamp = json.getString("timestamp");
req.packageValue = json.getString("package");
req.sign = json.getString("sign");
req.extData = "app data"; // optional
Toast.makeText(PayActivity.this, "正常調起支付", Toast.LENGTH_SHORT).show();
// 在支付之前,如果應用沒有註冊到微信,應該先調用IWXMsg.registerApp將應用註冊到微信
api.sendReq(req);
}else{
Log.d("PAY_GET", "返回錯誤"+json.getString("retmsg"));
Toast.makeText(PayActivity.this, "返回錯誤"+json.getString("retmsg"), Toast.LENGTH_SHORT).show();
}
}else{
Log.d("PAY_GET", "服務器請求錯誤");
Toast.makeText(PayActivity.this, "服務器請求錯誤", Toast.LENGTH_SHORT).show();
}
}catch(Exception e){
Log.e("PAY_GET", "異常:"+e.getMessage());
Toast.makeText(PayActivity.this, "異常:"+e.getMessage(), Toast.LENGTH_SHORT).show();
}
payBtn.setEnabled(true);
}
});
}
此圖爲APP端調起支付的參數列表。
注意:微信支付需要打包APK,否則無法調起微信客戶端進行支付,只能在你未登錄微信的情況下調起微信登錄!