首先啰嗦一下,可能有的朋友不明白这些东西,或者还没有用过,在此大致的介绍一下:
微信.开放平台 ---针对程序猿的,有程序开发能力的 研发对接应用的,反正面向的是软件公司,个人开发者
微信.商户平台 是申请微信支付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运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。 举例: 假设传送的参数如下: 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函数中判断支付状态。