微信支付的应用场景非常广泛,但是官方文档写的不够详细。我百度了很多资料,结果也不满意,在填了很多坑以后,特意写下此博客,给自己总结,也让后面的人少走些弯路。
微信支付的开发基本流程在官方文档已经说清楚了,由于我们项目的服务器接口还没写好,所以我先导入官方demo看能不能支付成功并成功回调到结果页面。
以Android Studio为例
1.先导入sdk包
compile files('libs/libammsdk.jar'),这个没难度,不放图了
调试的时候需要用到appid 测试的时候用官方demo里面的appid即可:wxb4ba3c02aa476ea1
2.核心代码
//1.注册appid
api = WXAPIFactory.createWXAPI(this, "wxb4ba3c02aa476ea1");
//2.将该app注册到微信
api.registerApp("wxb4ba3c02aa476ea1");
//3.预支付请求的服务器地址
String url = "http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=android";
</pre><p></p><pre>
3.请求服务器获取结果,并调用微信支付
try {
JSONObject json = new JSONObject(s);
if(null != json ){
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(context, "正常调起支付", Toast.LENGTH_SHORT).show();
// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
api.sendReq(req);
}else{
Log.d("PAY_GET", "返回错误"+json.getString("retmsg"));
Toast.makeText(context, "返回错误"+json.getString("retmsg"), Toast.LENGTH_SHORT).show();
}
4.支付成功后的回调页面,一点要在com.xxx.xxx.wxapi包下,也就是最后一个包是wxapi,文件名必须是WXPayEntryActivity
代码,注意在回调支付结果的时候也需要注册密钥,而且和之前那个不一样,这边还用官方demo提供的wxd930ea5d5a258f4f
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);
LogUtil.d("jieguo","ol");
setContentView(R.layout.activty_res);
api = WXAPIFactory.createWXAPI(this, "wxd930ea5d5a258f4f");
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) {
int errCode = resp.errCode;
if (errCode == 0) {
// 0成功 展示成功页面
Log.d("test","支付成功的回调方法--onResp--");
new AlertDialog.Builder(this).setMessage("支付成功").setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
finish();
}
}).setTitle("提示").create().show();
}
else if (errCode == -1) {
//-1 错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
LogUtil.d("fail","-1 错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。");
new AlertDialog.Builder(this).setMessage("支付出错").setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
finish();
}
}).setTitle("提示").create().show();
finish();
}
else if (errCode == -2) {
//-2 用户取消 无需处理。发生场景:用户不支付了,点击取消,返回APP。
finish();
}
}
}
5.还有一点千万注意,这个WXPayEntryActivity一定要注册,而且要设置下,否则不会调用的
<activity android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:screenOrientation="portrait"/>
我当时还碰到一个坑,支付成功一次以后,就一直报-1的错误了,是因为当前app的签名文件和demo里面的签名不一样。
将自己的应用签名换成和微信开放平台上应用签名一致,简单的说就是第一次应用签名的时候有个.keystore文件,拿过来重新布置一下(对于签名不熟悉的童鞋,可以百度一下)。注意一点微信开放平台上面的包名必须和你在配置文件中注册的包名一致我拿官方支付的demo演示一下