微信支付走過的那些坑
作爲一個大四的準畢業生,懵懂的我來到了人生的第一個公司,在開發過程中也遇到了各種各樣的問題,在這裏和大家分享一下
微信支付
首先,去微信開放平臺下載Android開發工具包、範例代碼和簽名生成工具
微信官方資源下載
1.將Android開發工具包裏jar文件下的mta-sdk-1.6.2.jar、open_sdk_r5756.jar和範例代碼中libs文件夾下的libammsdk.jar放在Android Studio項目的lib文件夾下,並且選中右鍵Add as library…
2.MainActivity.class代碼如下:
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
import com.tencent.mm.sdk.modelpay.PayReq;
import com.tencent.mm.sdk.openapi.IWXAPI;
import org.json.JSONException;
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity {
private IWXAPI iwxApi;
private String string = "{'appid':'wxa123','partnerid':'123','prepayid':'wx123','noncestr':'wka123','timestamp':123,'package':'Sign=WXPay','sign':'123'}";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iwxApi = WXAPIFactory.createWXAPI(getActivity(), null);
iwxApi.registerApp("APP ID");
try {
PayReq req = new PayReq();
JSONObject json = new JSONObject(string);
req.appId = json.getString("appid");
req.nonceStr = json.getString("noncestr");
req.packageValue = json.getString("package");
req.partnerId = json.getString("partnerid");
req.timeStamp = json.getString("timestamp");
req.prepayId = json.getString("prepayid");
req.sign = json.getString("sign");
req.extData = "app data";
if (!iwxApi.sendReq(req)) {
Toast.makeText(MainActivity.this, "請安裝微信", Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
註解:這裏的string應該爲請求網絡後的json,通過PayReq類將字段進行封裝(注意:此處的字段順序不能亂,否則會支付會一直返回-1),最後通過sendReq()方法吊起微信支付。APP ID 處應該填寫微信開發平臺的APPID
如果還想支付回調,則需要在項目包名下新建wxapi文件夾,放入WXPayEntryActivity.class文件(這兩個名字都不能有一點錯),代碼如下:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
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;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this, null);
api.handleIntent(getIntent(), this);
}
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
public void onReq(BaseReq req) {
}
public void onResp(BaseResp resp) {
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
switch (resp.errCode) {
case 0:
//成功
break;
case -1:
//失敗
break;
case -2:
// 取消
break;
default:
break;
}
}
}
}
註解:該類中setContentView()可以直接刪除,回調操作都在onResp中進行處理
還需要在AndroidManifest.xml中添加如下內容:
<uses-permission android:name="android.permission.INTERNET" />
<!-- 微信支付 -->
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop" />
<activity
android:name="com.test.user.myapplication.MainActivity"
android:exported="true"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="wxa791d98ecb40324b" />
</intent-filter>
</activity>
最後的重點來了,本人就在這栽了個大跟頭。
將項目進行打包簽名,不然是無法吊起微信支付的,點擊微信支付後會一直閃屏。
打包簽名如下:
1.點擊Build選擇Generate Signed APK…
2.如果沒有keystore則創建一個新的keystore,點擊Create New…
3.將信息填寫完整點擊OK即可。
4.勾選Remember passwords,點擊Nest
5.輸入步驟3中的密碼,點擊OK
6.點擊finish即可,app-release.app在項目的app目錄下
到此已經大功告成了,微信支付已經可以順利實現了。
下面附幾張圖片