Android中微信支付的调用方法

商户在微信开放平台申请开发应用后,微信开放平台会生成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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值