Android编程实现的微信支付功能详解【附Demo源码下载】

Android编程实现的微信支付功能详解【附Demo源码下载】,第1张

概述本文实例讲述了Android编程实现的微信支付功能。分享给大家供大家参考,具体如下:

本文实例讲述了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源码下载】所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1145684.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存