微信支付走过的那些坑
作为一个大四的准毕业生,懵懂的我来到了人生的第一个公司,在开发过程中也遇到了各种各样的问题,在这里和大家分享一下
微信支付
首先,去微信开放平台下载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目录下
到此已经大功告成了,微信支付已经可以顺利实现了。
下面附几张图片