微信支付

微信支付

三方支付在安卓开发中应用广泛,在做微信支付之前我也查了很多资料,查看博客,发现大家写的都不是很详细,也可以理解为每个人遇到的难点不同所以解释问题的侧重点不同。作为菜鸟,我把自己成功集成微信支付的过程代码写下了,既是总结,也是分享经验。BB了这么多就开始吧。

1.创建应用

2.集成支付

  • 1.导入libammsdk.jar包
  • 2.添加权限
 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
 <uses-permission  android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  • 3.
    <activity
    android:name="net.sourceforge.simcpux.wxapi.WXPayEntryActivity"
    android:exported="true"
    android:launchMode="singleTop"/>

    注意:上述声明的activity(WXPayEntryActivity)不在jar包中,所以我们需要从demo
    中拷贝WXPayEntryActivity.java文件放到我们工程中,包名要保持不变。

3.调用微信支付

 /**
     * 微信支付
     *
     * @param view
     */
    public void wxpay(View view) {

        IWXAPI api = WXAPIFactory.createWXAPI(this, Constants.APP_ID, true);
        PayReq payReq = new PayReq();
        //1.官方网站申请到的合法appId
        payReq.appId = Constants.APP_ID;
        //2.微信支付分配商户号
        payReq.partnerId = Constants.WEIXIN_MCH_ID;
        //3.微信返回的支付交易会话ID,由后台处理
        //"prepay_id": "wx20170529105445617b34d3fd0731390820",
        payReq.prepayId = "wx20170529105445617b34d3fd0731390820";
        //4.时间戳,需转换为秒
        payReq.timeStamp = "" + (System.currentTimeMillis() / 1000);
        //5.拓展字段, 官网说是暂填写固定值Sign=WXPay, 但是Demo中是这样写的"prepay_id=" + prepayId;。[Demo中的不对]
        payReq.packageValue = "Sign=WXPay";
        //6.
        payReq.nonceStr = genNonceStr();
        //7.
        payReq.sign = getWeiXinPaySign(payReq);
        //8.
        boolean b = api.sendReq(payReq);
        if (!b) {
            Intent i = new Intent(this, WXPayEntryActivity.class);
            i.putExtra("message", "未安装微信客户端");
            startActivity(i);
        }
    }

    private String genNonceStr() {
        Random random = new Random();
        return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
    }

    private String getWeiXinPaySign(PayReq payReq) {
        if (null == payReq) {
            return null;
        }

        List<NameValuePair> signParams = new LinkedList<NameValuePair>();

        if (!TextUtils.isEmpty(payReq.appId)) {
            signParams.add(new BasicNameValuePair("appid", payReq.appId));
        }
        if (!TextUtils.isEmpty(payReq.extData)) {
            signParams.add(new BasicNameValuePair("extdata", payReq.extData));
        }
        if (!TextUtils.isEmpty(payReq.nonceStr)) {
            signParams.add(new BasicNameValuePair("noncestr", payReq.nonceStr));
        }
        if (!TextUtils.isEmpty(payReq.packageValue)) {
            signParams.add(new BasicNameValuePair("package", payReq.packageValue));
        }
        if (!TextUtils.isEmpty(payReq.partnerId)) {
            signParams.add(new BasicNameValuePair("partnerid", payReq.partnerId));
        }
        if (!TextUtils.isEmpty(payReq.prepayId)) {
            signParams.add(new BasicNameValuePair("prepayid", payReq.prepayId));
        }
        if (!TextUtils.isEmpty(payReq.timeStamp)) {
            signParams.add(new BasicNameValuePair("timestamp", payReq.timeStamp));
        }

        return genAppSign(signParams);
    }

    /**
     * 生成微信支付签名
     *
     * @param params
     * @return
     */
    private String genAppSign(List<NameValuePair> params) {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < params.size(); i++) {
            sb.append(params.get(i).getName());
            sb.append('=');
            sb.append(params.get(i).getValue());
            sb.append('&');
        }
        sb.append("key=");
        sb.append(Constants.WEIXIN_API_KEY); //秘钥

        String appSign = MD5.getMessageDigest(sb.toString().getBytes());
        return appSign;
    }

注意:namevaluepair不能导包 http://blog.youkuaiyun.com/cyooke/article/details/51783572
参考这篇博客你可能会出现这样的问题
这里写图片描述

解决:
这里写图片描述

以上就完成了微信支付,

注意:微信的产品不管是支付还是分享一定不能使用debug签名测试,你会遇到类找不到的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值