Android支付之微信支付(二)

首先啰嗦一下,可能有的朋友不明白这些东西,或者还没有用过,在此大致的介绍一下:

微信.开放平台 ---针对程序猿的,有程序开发能力的 研发对接应用的,反正面向的是软件公司,个人开发者

微信.商户平台 是申请微信支付ok之后才获取,他会以邮件的形式发送到你邮箱()

微信.公众平台 我们见的公众号,微信上面一大把,,,,只要是针对非程序猿的,比方说商户啊,等待,作为一个媒体平台或者活是服务窗口,主要是面向大众的

微信.订阅号 企业号 服务号,都是隶属于公众平台

下面是开始集成微信支付的截图















以上就是本人在公司开发前期需要做的工作,当然写demo例外

总结一下:

1.需要注册微信开发者账号,如果要实现支付功能,需要在填写app具体信息并审核ok之后(一般是3天,有时候快),才能申请开通支付功能,申请需要填写一系列的资料并交上每年300老毛头,就等待吧  如上图,

2.审核通过之后,进入商家平台,----之前的版本在 密码管理选项中,获得秘钥。。很长的一串(一般第一次会发邮件过来)

3.上述工作ok之后就能完成公司级的 微信支付了,否者就是各种报错,各应用的appid不能混用,没开发一个app需要一个appid  加上300元每年

下面就开始过支付代码,也很简单(其实 支付代码demo都已经说的很清楚了,网上也有很多介绍,但是像上面的那些不是每个开发者都经历过的,之前就是不了解上面那些知识,有时候app一多,公司开发人员不多(可能是一个人),这个后 知道上面的常识,就能避免很多啥啥不能支付的问题出现)

/**
 * 微信支付
 */
new WXPayRequest1(context, orderBean_paypart.getJSONObjectitem()).WXPay();

从上述语句可知:微信支付只需要2个参数 :
1.上下文,

2.微信支付的订单信息(多少钱 订单号 通知链接,等) 类似与支付宝支付
注:订单信息的拼接(有的用xml 有的用json)别搞晕了

下面上代码,
JSONObject item = new JSONObject();
   item.put("trade_no",订单号 );
   item.put("amount", 金额);
   item.put("pname",商品名字 );
   item.put("notify_url",通知链接);
此步可以放到 主业务板块中完成,然后调用支付模块即可,WXPAY的代码都是公用的

但是必须得弄懂他,每个方法都加上log 这与出啥错都能知道,
好下面我们介绍WXPay()的代码
这里在说一个注意事项:老板支付和新版支付不一样 老版本的支付多一个参数(这个在版本迭代的开发中的注意了 ,因为现在申请的支付,在反馈邮件中那个参数没有了,)

    public static final String PARTNER_KEY = "Mgxxxxxxxxx41966554881548fasdf";
    public static final String PARTNER_ID = "1211111302";
    public static final String APP_ID = "wxb6dd1111111191e";
    public static final String APP_SECRET = "5658111111110125f06700704f6";
    public static final String APP_KEY = "";老版本才有,新的v3的没有这个参数了

开始支付

/**
 * 构造方法
 * @param context
 * @param obj  组装的参数包含 订单号 名字  多少钱等
 */
public WXPayRequest1(Context context, JSONObject obj) {
    mContext = context;
    req = new PayReq();//支付参数
    sb = new StringBuffer();
    api = WXAPIFactory.createWXAPI(mContext, null);
    api.registerApp(Constants.APP_ID);//注册app支付功能
    mItem = obj;
}

public void WXPay() {
    GetPrepayIdTask getPrepayId = new GetPrepayIdTask();//获得prepayid
    getPrepayId.execute();
}

获得prepayid

  /**
     * 获得PrepayId 注意(一般在这里出错比较多,一般可以从后台获取,注意编码格式)
     */
    private class GetPrepayIdTask extends AsyncTask<Void, Void, Map<String, String>> {
        private ProgressDialog dialog;
        @Override
        protected void onPreExecute() {
            dialog = ProgressDialog.show(mContext, mContext.getString(R.string.app_tip), mContext.getString(R.string.getting_prepayid));
        }

        @Override
        protected void onPostExecute(Map<String, String> result) {
            if (dialog != null) {
                dialog.dismiss();
            }
//       sb.append("prepay_id\n" + result.get("prepay_id") + "\n\n");
            LogUtils_Pay.i(TAG, sb.toString());
            resultunifiedorder = result;
            genPayReq(resultunifiedorder);//获得PrepayId之后,开始填充PayReq参数
            sendPayReq();//
        }
        @Override
        protected void onCancelled() {
            super.onCancelled();
        }
        @Override
        protected Map<String, String> doInBackground(Void... result) {

            String url = String.format("https://api.mch.weixin.qq.com/pay/unifiedorder");//获得PrepayId的地址,下面只是的这个是老版本的
//       String url = String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", Constants.APP_ID, Constants.APP_SECRET);
            if (dialog != null) {
                dialog.dismiss();
            }
            String entity = genProductArgscopy();
            Log.e("orion", "doInBackground,entity=" + entity);
            byte[] buf = Util.httpPost(url, entity);
            String content = new String(buf);
            Log.e("orion", "doInBackground,content=" + content);
            Map<String, String> xml = decodeXml(content);//将返回回来的参数 解析成map集合
            return xml;
        }
    }

组合填充PayReq参数

说明:

1.签名算法
签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA特别注意以下重要规则:
  参数名ASCII码从小到大排序(字典序);
  如果参数的值为空不参与签名;
  参数名区分大小写;
  验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
  微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key=(API密钥的值)得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到signsignValue举例:
假设传送的参数如下:
appid  wxd930xxxxa258f4f
mch_id     10000100
device_info   1000
body   test
nonce_str ibuaiVcKdpRxkhJA
第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:
stringA="appid=wxd930xxxxa258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";
第二步:拼接API密钥:
stringSignTemp="stringA&key=192006250bxxxx247ecxxxxxe69f6a2d"
sign=MD5(stringSignTemp).toUpperCase()="9A0A865xxxxD6984697E2CA0A9CF3B7"

代码:

  /**
     * 组合参数
     * @param resultunifiedorder 含有prepayid
     */
    private void genPayReq(Map<String, String> resultunifiedorder) {
        req.appId = Constants.APP_ID;
        req.partnerId = Constants.PARTNER_ID;
        req.prepayId = resultunifiedorder.get("prepay_id");
        // TODO
        req.nonceStr = genNonceStr();
        req.timeStamp = String.valueOf(genTimeStamp());
        req.packageValue = "Sign=" + resultunifiedorder.get("prepay_id");
        List<NameValuePair> signParams = new LinkedList<NameValuePair>();
        //这里按照ASCII字典顺序排好序
        signParams.add(new BasicNameValuePair("appid", req.appId));
        signParams.add(new BasicNameValuePair("noncestr", req.nonceStr));
        signParams.add(new BasicNameValuePair("package", req.packageValue));
        signParams.add(new BasicNameValuePair("partnerid", req.partnerId));
        signParams.add(new BasicNameValuePair("prepayid", req.prepayId));
        signParams.add(new BasicNameValuePair("timestamp", req.timeStamp));
        req.sign = genAppSign(signParams);//签名
//    sb.append("sign\n" + req.sign + "\n\n");
        LogUtils_Pay.i(TAG, sb.toString());
        Log.e("orion", "genPayReq=" + signParams.toString());
    }

调用支付

private void sendPayReq() {
    api.registerApp(Constants.APP_ID);
    api.sendReq(req);
}

回调

在自己的项目的包路径中实现WXPayEntryActivity类,即添加 .wxapi.WXPayEntryActivity,在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准


下面的详细的可以看看这片文章 比较详细

http://www.2cto.com/weixin/201505/400447.html

注:

在集成微信支付过程中,又集成了环信聊天的demo,可能出现编译失败,而且提示不够明确,其实这是因为环信聊天的demo中有一个用于微信分享的 libammsdk.jar 和支付的jar中的方法冲突了,因此删除一个即可(注意引用关系)

微信支付小结

1.注册微信开放平台账号,添加app并开通微信支付功能(需付费,时间大约3天审核完毕),每个app要单独认证
2.下载微信支付sdk添加到支付模块中,并在清单文件中配置返回相应的activity;
3.组合好支付需要的参数,调用new WXPayRequest(context,组合好的参数).wxPay();
4.在项目的包路径下新建wxapi包,并添加WXPayEntryActivity并实现IWXAPIEventHandler接口 , onResp函数中判断支付状态。
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值