本文实例讲述了AndroID编程实现的微信支付功能。分享给大家供大家参考,具体如下:
最近公司弄Ionic框架,项目中需要微信支付,无奈,把我调过去弄,期间也是几近崩溃,好在皇天不负有心人,在看别人的文档,终于是在项目中集成了微信支付,下面作为一个小白的我,想要把我的经验分享给大家,希望对大家有所帮助。
先给一个可用的demo吧(运行前先看txt文件)
demo代码点击此处本站下载。
这个demo是基于eclipse开发的,博主也在AndroID Studio开发过微信支付,原理都是一样的,大家把这个demo弄懂了,在AS上面也是一样的。
(温馨提示:大家下载下来可能会出错,也有可能不会。下面给出出错的解决方法:1.进入项目中的WeIXinPay->Build Path->configure build path,移除那个报错的jar包。 2.会出现资源找不到的情况,这是因为你没有v7包,下载一个v7包,或者把出错的地方都删除,只是一个主题,删除了看起来不好看而已,当然,你也可以用你有的主题。 还有一个问题需要提出来,就是你可能按照里面的text *** 作的仍然调不起客户端,有可能是你没有安装微信客户端,因为我没有做判断。这个demo不会出现只能成功支付一次的情况,博主亲测有效。出现只能支付一次只能说明你的签名没有对应)
1. 去微信开放平台申请微信支付服务,绑定自己的应用这里具体不多讲,但是一定要申请完成,将会得到是三个参数
//appID 微信分配的公众账号IDpublic static final String APP_ID = "";//商户号 微信分配的公众账号IDpublic static final String MCH_ID = "";// API密钥,在商户平台设置public static final String API_KEY= "";
**坑点提示:在微信开发平台设置包名和签名。这里的包名一定要和你自己的包名一样,就是manifest中的package,签名一定要和你用官方app生成的一样(https://open.weixin.qq.com/zh_CN/HTMLedition/res/dev/download/sdk/Gen_Signature_AndroID.apk)。
微信会根据你的填写的包名,然后对你的keystore进行一种算法,生成你的签名。包名和签名一定要和微信开放平台的相同。不过这里需要注意的是,如果你发布的正式版本,需要用官方app重新生成签名,然后在开放平台重新设置sign,因为测试版本的keystore与正式版的keystore不一样。总之,就是你用的keystore生成的sign要和微信开放平台的时刻保持一致。**
2. 准备工作做好了,接下来就是开发了,先下载微信的jar包,导入。
微信支付分为三个步骤
① .生成prepayID
@OverrIDeprotected Map<String,String> doInBackground(String... params) { // Todo auto-generated method stub String url=String.format(params[0]); String entity=getProductArgs(); Log.e("Simon",">>>>"+entity); byte[] buf=Util.httpPost(url,entity); String content = new String(buf); Log.e("orion","----"+content); Map<String,String> xml=decodeXml(content); return xml;}
② .生成签名参数
private voID genPayReq() { req.appID = Constants.APP_ID; req.partnerID = Constants.MCH_ID; if (resultunifIEdorder!=null) { req.prepayID = resultunifIEdorder.get("prepay_ID"); req.packageValue = "prepay_ID="+resultunifIEdorder.get("prepay_ID"); } else { Toast.makeText(MainActivity.this,"prepayID为空",Toast.LENGTH_SHORT).show(); } req.nonceStr = getNoncestr(); req.timeStamp = String.valueOf(genTimeStamp()); List<nameValuePair> signParams = new linkedList<nameValuePair>(); 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"); textVIEw.setText(sb.toString()); Log.e("Simon","----"+signParams.toString());}
③ .调起支付
/** 调起微信支付*/private voID sendPayReq() { msgAPI.registerapp(Constants.APP_ID); msgAPI.sendReq(req); Log.i(">>>>>",req.partnerID);}
下面给出完整代码
package com.Alpha.live;import java.io.StringReader;import java.util.HashMap;import java.util.linkedList;import java.util.List;import java.util.Map;import java.util.Random;import org.apache.http.nameValuePair;import org.apache.http.message.BasicnameValuePair;import org.xmlpull.v1.XmlPullParser;import com.tencent.mm.sdk.modelpay.PayReq;import com.tencent.mm.sdk.openAPI.IWXAPI;import com.tencent.mm.sdk.openAPI.WXAPIFactory;import androID.app.Activity;import androID.app.AlertDialog;import androID.app.ProgressDialog;import androID.os.AsyncTask;import androID.os.Bundle;import androID.util.Log;import androID.util.Xml;import androID.vIEw.VIEw;import androID.vIEw.VIEw.OnClickListener;import androID.Widget.button;import androID.Widget.TextVIEw;import androID.Widget.Toast;/** * Created by Simon on 2016/12/2. */public class MainActivity extends Activity implements OnClickListener { private button submitbutton; private button confirmbutton; private TextVIEw textVIEw; private StringBuffer sb; private Map<String,String> resultunifIEdorder; private PayReq req; private final IWXAPI msgAPI = WXAPIFactory.createWXAPI(this,null); @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); submitbutton=(button) findVIEwByID(R.ID.bt_submit_order); confirmbutton=(button) findVIEwByID(R.ID.bt_corfirm); textVIEw=(TextVIEw) findVIEwByID(R.ID.tv_prepay_ID); submitbutton.setonClickListener(this); confirmbutton.setonClickListener(this); sb=new StringBuffer(); req=new PayReq(); } @OverrIDe public voID onClick(VIEw v) { // Todo auto-generated method stub switch (v.getID()) { case R.ID.bt_submit_order: String urlString="https://API.mch.weixin.qq.com/pay/unifIEdorder"; PrePayIDAsyncTask prePayIDAsyncTask=new PrePayIDAsyncTask(); prePayIDAsyncTask.execute(urlString); //生成prepayID break; case R.ID.bt_corfirm: genPayReq();//生成签名参数 sendPayReq();//调起支付 break; default: break; } } /* * 调起微信支付 */ private voID sendPayReq() { msgAPI.registerapp(Constants.APP_ID); msgAPI.sendReq(req); Log.i(">>>>>",req.partnerID); } private long genTimeStamp() { return System.currentTimeMillis() / 1000; } private voID genPayReq() { req.appID = Constants.APP_ID; req.partnerID = Constants.MCH_ID; if (resultunifIEdorder!=null) { req.prepayID = resultunifIEdorder.get("prepay_ID"); req.packageValue = "prepay_ID="+resultunifIEdorder.get("prepay_ID"); } else { Toast.makeText(MainActivity.this,"----"+signParams.toString()); } 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.API_KEY); this.sb.append("sign str\n"+sb.toString()+"\n\n"); String appSign = MD5.getMessageDigest(sb.toString().getBytes()); Log.e("Simon","----"+appSign); return appSign; } private class PrePayIDAsyncTask extends AsyncTask<String,VoID,Map<String,String>> { private ProgressDialog dialog; @OverrIDe protected voID onPreExecute() { // Todo auto-generated method stub super.onPreExecute(); dialog = ProgressDialog.show(MainActivity.this,"提示","正在提交订单"); } @OverrIDe protected Map<String,String> xml=decodeXml(content); return xml; } @OverrIDe protected voID onPostExecute(Map<String,String> result) { // Todo auto-generated method stub super.onPostExecute(result); if (dialog != null) { dialog.dismiss(); } sb.append("prepay_ID\n"+result.get("prepay_ID")+"\n\n"); textVIEw.setText(sb.toString()); resultunifIEdorder=result; } } public Map<String,String> decodeXml(String content) { try { Map<String,String> xml = new HashMap<String,String>(); XmlPullParser parser = Xml.newPullParser(); parser.setinput(new StringReader(content)); int event = parser.getEventType(); while (event != XmlPullParser.END_document) { String nodename=parser.getname(); switch (event) { case XmlPullParser.START_document: break; case XmlPullParser.START_TAG: if("xml".equals(nodename)==false){ //实例化student对象 xml.put(nodename,parser.nextText()); } break; case XmlPullParser.END_TAG: break; } event = parser.next(); } return xml; } catch (Exception e) { Log.e("Simon","----"+e.toString()); } return null; } private String getProductArgs() { // Todo auto-generated method stub StringBuffer xml=new StringBuffer(); try { String nonceStr=getNoncestr(); xml.append("<xml>"); List<nameValuePair> packageParams=new linkedList<nameValuePair>(); packageParams.add(new BasicnameValuePair("appID",Constants.APP_ID)); packageParams.add(new BasicnameValuePair("body","APP pay test")); packageParams.add(new BasicnameValuePair("mch_ID",Constants.MCH_ID)); packageParams.add(new BasicnameValuePair("nonce_str",nonceStr)); packageParams.add(new BasicnameValuePair("notify_url","https://www.baIDu.com"));//写你们的回调地址 packageParams.add(new BasicnameValuePair("out_Trade_no",genOutTradNo())); packageParams.add(new BasicnameValuePair("total_fee","1")); packageParams.add(new BasicnameValuePair("Trade_type","APP")); String sign=getPackageSign(packageParams); packageParams.add(new BasicnameValuePair("sign",sign)); String xmlString=toXml(packageParams); return xmlString; } catch (Exception e) { // Todo: handle exception return null; } } //生成订单号,测试用,在客户端生成 private String genOutTradNo() { Random random = new Random();// return "dasgfsdg1234"; //订单号写死的话只能支付一次,第二次不能生成订单 return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes()); } //生成随机号,防重发 private String getNoncestr() { // Todo auto-generated method stub Random random=new Random(); return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes()); } /** 生成签名 */ private String getPackageSign(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.API_KEY); String packageSign = MD5.getMessageDigest(sb.toString().getBytes()).toupperCase(); Log.e("Simon",">>>>"+packageSign); return packageSign; } /* * 转换成xml */ private String toXml(List<nameValuePair> params) { StringBuilder sb = new StringBuilder(); sb.append("<xml>"); for (int i = 0; i < params.size(); i++) { sb.append("<"+params.get(i).getname()+">"); sb.append(params.get(i).getValue()); sb.append("</"+params.get(i).getname()+">"); } sb.append("</xml>"); Log.e("Simon",">>>>"+sb.toString()); return sb.toString(); }}
接下来就是有个支付结果的页面代码。是微信官方提供的一个类。你要在manifest注册这个类。这里需要注意的是,这个类必须放在wxAPI包下,你自己新建一个包即可。
为了大家可以直接运行这个demo,我的微信加签都是在本地执行的,获取prepayID和加签都应该在服务端完成,还有最终的支付返回结果也是以服务端的为准。
*下面给出运行结果图*
大家下载demo然后把参数换了,弄下keystore,包名,签名。应该就可以用了。
更多关于AndroID相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android数据库 *** 作技巧总结》、《Android编程之activity *** 作技巧总结》、《Android文件 *** 作技巧汇总》、《Android编程开发之SD卡 *** 作方法汇总》、《Android资源 *** 作技巧汇总》、《Android视图View技巧总结》及《Android控件用法总结》
希望本文所述对大家AndroID程序设计有所帮助。
总结以上是内存溢出为你收集整理的Android编程实现的微信支付功能详解【附Demo源码下载】全部内容,希望文章能够帮你解决Android编程实现的微信支付功能详解【附Demo源码下载】所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)