android应用集成微信app支付

前言

本文主要讲述的是android移动应用如何集成微信app支付。主要讲的是接入流程和开发事项,不是特别详细,旨在给未曾开发过微信支付的人讲述开发流程,让人知道从何下手。

接入流程

首先,需要在微信开放平台注册一个账号,然后认证开发者资质,成功认证后创建一个应用;接下来为应用申请微信支付,成功开户后,在线签署协议,最后就是开发了。接入流程详情参考APP微信商户申请步骤

微信支付业务流程

步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。
步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
步骤4:商户APP调起微信支付。
步骤5:商户后台接收支付通知。
步骤6:商户后台查询支付结果。

开发步骤

1、在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。设置界面在【开放平台】中的栏目【管理中心 / 修改应用 / 修改开发信息】里面。

其中应用签名是通过签名工具获取安装在手机上的应用的应用签名,这个应用签名对应着一个包名和keystore文件。改了包名或者keystore文件的话这里也需要改,不然无法调起支付。
2、上一步弄好了之后就开始开发了。先下载sdk和demo,将sdk里libs文件夹下的jar包拷入项目里,然后新建一个包名为wxapi的包,然后将demo里WXPayEntryActivity这个类拷入这个包下,只需改动两个地方:

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);//改成自己的APPID
        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) {
    }

    /**
     * 支付结果回调处理,在这里处理支付结果以及后续操作
     * 返回结果:
     * 0:成功
     * -1:错误,可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
     * -2:用户取消,
     */
    @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();
        }
    }
}

接下来就是参考demo里PayActivity这个类自己写一个调起支付工具类:

/**
 * 微信支付
 * 该类仅供参考
 */
public class WeiXinPay {
    //1、集成好微信支付的sdk
    //2、请求预支付(后台完成统一下单接口)
    //3、调起微信支付

    private IWXAPI api;
    private Context context;
    private String str1;

    public void WeiXinPay(Context context){

    }

    /**
     * 调起微信支付,参数都是后台返回
     */
    public  void weixinPay(WeiXinPayCostBean weiXinPayCostBean){
        //注册微信支付
        api = WXAPIFactory.createWXAPI(context, "你的appId");
        api.registerApp("你的appId");

        boolean isPaySupported = api.getWXAppSupportAPI() >= Build.PAY_SUPPORTED_SDK_INT;
        boolean isWXAppInstalledAndSupported = api.isWXAppInstalled();
        if (isWXAppInstalledAndSupported) {
            if (isPaySupported) {
                PayReq req = new PayReq();
                req.appId           =weiXinPayCostBean.getAppId;//appid
                req.partnerId       = //商户号
                req.prepayId        = //预支付交易会话id
                req.packageValue    =  //扩展字段,暂时填写Sign=WXPay
                req.nonceStr        = //随机字符串
                req.timeStamp       = //时间戳

                str1 = "appid=你的appId"+"&noncestr="+"随机字符串"+"&package="+"Sign=WXPay"+ "&partnerid=商户号"+"&prepayid="+"预支付Id"+"&timestamp="+"时间戳";
                String stringSignTemp = str1 +"&key=你的AppKey";
                String sign= MD5Util.md5(stringSignTemp).toUpperCase();
                req.sign            = sign;//签名
                req.extData         = "app data"; // optional
                api.sendReq(req);//调起支付
            } else {
                Toast.makeText(context, "检测到微信未开启或当前版本不支持微信支付,请开启微信后重新支付或更新当前版本", Toast.LENGTH_LONG).show();
                api.openWXApp();
            }
        }else {
            Toast.makeText(context, "检测到微信未安装,请安装微信后重新支付", Toast.LENGTH_LONG).show();
        }
    }
}

public class MD5Util {
    public static String md5(String string) {
        byte[] hash;
        try {
            hash = MessageDigest.getInstance("MD5").digest(
                    string.getBytes("UTF-8"));
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("Huh, MD5 should be supported?", e);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("Huh, UTF-8 should be supported?", e);
        }

        StringBuilder hex = new StringBuilder(hash.length * 2);
        for (byte b : hash) {
            if ((b & 0xFF) < 0x10)
                hex.append("0");
            hex.append(Integer.toHexString(b & 0xFF));
        }
        return hex.toString();
    }

}

这些签名参数以及签名最好是后台直接返回,不要写在app端,参数含义参考APP端调起支付的参数列表。至于支付回调根据个人习惯用什么来接收处理。
至此微信支付就集成好了。
参考:微信支付开发文档

猜你喜欢

转载自blog.csdn.net/ws614054446/article/details/53607255