Android中微信支付的调用方法
16lz
2021-01-26
商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。本文讲解Android微信支付快速集成案例及有效解决返回值-1。
下面我们参考微信官方APP端开发步骤说明,一步一步集成微信支付功能:
1、商户APP工程中引入微信JAR包这里写图片描述,该包可以从官方微信支付demo中获得。
2、编写调起微信支付的代码
官方提供的代码如下:
注意:
IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
请将官方提供的上面这段代码改为如下代码:
appId为从微信后台申请而来以正式签名md5+应用程序包名来获得《注意是md5而不是sha1》IWXAPI msgApi=WXAPIFactory.createWXAPI(this,appId, false);
package com.longyue.weixinpaydemo;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.Toast;import com.tencent.mm.sdk.modelpay.PayReq;import com.tencent.mm.sdk.openapi.IWXAPI;import com.tencent.mm.sdk.openapi.WXAPIFactory;import org.json.JSONException;import org.json.JSONObject;public class PayActivity extends Activity { private IWXAPI api;//微信支付分享调用 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pay); api = WXAPIFactory.createWXAPI(this, Constants.APP_ID,false); //api = WXAPIFactory.createWXAPI(this, "wxb4ba3c02aa476ea1"); // 将该app注册到微信 api.registerApp(Constants.APP_ID); Button appayBtn = (Button) findViewById(R.id.appay_btn); appayBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {//这是运行的微信官方Demo,在实际运用中这个json串要从后台获得String url = "http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=android"; final Button payBtn = (Button) findViewById(R.id.appay_btn); Toast.makeText(PayActivity.this, "获取订单中...", Toast.LENGTH_SHORT).show(); HttpUtils.doGetAsyn(url, new HttpUtils.CallBack() { @Override public void onRequestComplete(byte[] buf) { if (buf != null && buf.length > 0) { String content = new String(buf); Log.e("get server pay params:", content); JSONObject json; try { 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(); } } catch (JSONException e) { e.printStackTrace(); } } else { Log.d("PAY_GET", "服务器请求错误"); Toast.makeText(PayActivity.this, "服务器请求错误", Toast.LENGTH_SHORT).show(); } } }); } }); }}
4、支付结果回调
“参照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调)”,比如我的包名为com.cn.cwvs.fruit:这里写图片描述
这里提供WXPayEntryActivity参考代码(请结合官方支付demo使用)
package com.longyue.weixinpaydemo.wxapi;import android.app.Activity;import android.app.AlertDialog;import android.content.Intent;import android.os.Bundle;import com.longyue.weixinpaydemo.Constants;import com.longyue.weixinpaydemo.R;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 static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity"; private IWXAPI api; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pay_result); api = WXAPIFactory.createWXAPI(this, Constants.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); if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.app_tip); builder.setMessage(getString(R.string.pay_result_callback_msg, String.valueOf(resp.errCode))); builder.show(); } }}
需要注意的是,如果errorCode总是为 -1,请尝试通过下面方法解决:
1、用提交的签名的keystore文件打包
2、清理微信的缓存
Demo下载
更多相关文章
- Android(安卓)Studio 设置代码提示和代码自动补全快捷键--Eclips
- Android(安卓)应用验证码模糊效果
- Android(安卓)O 8.0 通知(Notification)更新后的简单兼容写法
- Android(安卓)代码热修复详解
- android滑动切换屏幕(扒的是launcher2/workspace的源码)
- 这是一份非常适合收藏的Android进阶/面试重难点整理
- KISS Android(安卓)Library - Android库
- Android日志:Google官方下拉刷新控件
- Android(安卓)怎样获得手机信息