商户在微信开放平台申请开发应用后,微信开放平台会生成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下载

更多相关文章

  1. Android(安卓)Studio 设置代码提示和代码自动补全快捷键--Eclips
  2. Android(安卓)应用验证码模糊效果
  3. Android(安卓)O 8.0 通知(Notification)更新后的简单兼容写法
  4. Android(安卓)代码热修复详解
  5. android滑动切换屏幕(扒的是launcher2/workspace的源码)
  6. 这是一份非常适合收藏的Android进阶/面试重难点整理
  7. KISS Android(安卓)Library - Android库
  8. Android日志:Google官方下拉刷新控件
  9. Android(安卓)怎样获得手机信息

随机推荐

  1. Android APK 签名比对
  2. Android无障碍服务( Accessibility Servi
  3. OOM----内存溢出或内存泄漏
  4. Android设计缺陷--无法通话录音
  5. Android ListView工作原理完全解析,带你从
  6. 写在20110721:横竖屏切换
  7. Android屏幕刷新——源码分析
  8. Android DialogFragment宽度占满高度自适
  9. Android应用程序获得root权限
  10. Android RxJava:基础介绍与使用