前言:集成支持宝和微信支付,是公司获取收益的最主要的部分,这两大巨头几乎在支付业务上不可或缺,今天看下Simon_Crystin独家授权本公众号发步的Android支付实践(二)之微信支付详解与Demo,Simon_Crystin的blog地址为:http://blog.csdn.net/Simon_Crystin/。点击【阅读原文】,可下载案例的demo

最近公司弄Ionic框架,项目中需要微信支付,无奈,把我调过去弄,期间也是几近崩溃,好在皇天不负有心人,在看别人的文档,终于是在项目中集成了微信支付,下面作为一个小白的我,想要把我的经验分享给大家,希望对大家有所帮助。 
 
(温馨提示:大家下载下来可能会出错,也有可能不会。下面给出出错的解决方法:1.进入项目中的WeIXinPay->Build Path->configure build path,移除那个报错的jar包。 2.会出现资源找不到的情况,这是因为你没有v7包,下载一个v7包,或者把出错的地方都删除,只是一个主题,删除了看起来不好看而已,当然,你也可以用你有的主题。 还有一个问题需要提出来,就是你可能按照里面的text操作的仍然调不起客户端,有可能是你没有安装微信客户端,因为我没有做判断。这个demo不会出现只能成功支付一次的情况,博主亲测有效。出现只能支付一次只能说明你的签名没有对应)

先看下效果图:



1.去微信开放平台申请微信支付服务,绑定自己的应用这里具体不多讲,但是一定要申请完成,将会得到是三个参数

//appid 微信分配的公众账号ID
public static final String APP_ID = "";
//商户号 微信分配的公众账号ID
public 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包,导入。 
微信支付分为三个步骤 
1.生成prepayId

@Override
protected Map<String, String> doInBackground(String... params) {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;
}

2.生成签名参数

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());}

3.调起支付

/** 调起微信支付*/
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);@Overrideprotected 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();}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (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);      //生成prepayIdbreak;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, "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 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;@Overrideprotected void onPreExecute() {// TODO Auto-generated method stubsuper.onPreExecute();dialog = ProgressDialog.show(MainActivity.this, "提示", "正在提交订单");}@Overrideprotected Map<String, String> doInBackground(String... params) {// TODO Auto-generated method stubString 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;}@Overrideprotected void onPostExecute(Map<String, String> result) {// TODO Auto-generated method stubsuper.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 stubStringBuffer 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 exceptionreturn 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 stubRandom 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();}
}

第一时间获得博客更新提醒,以及更多android干货,源码分析,欢迎关注我的微信公众号,扫一扫下方二维码或者长按识别二维码,即可关注。

Android支付实践(二)之微信支付详解与Demo相关推荐

  1. Android 微信支付详解与Demo

    最近公司弄Ionic框架,项目中需要微信支付,无奈,把我调过去弄,期间也是几近崩溃,好在皇天不负有心人,在看别人的文档,终于是在项目中集成了微信支付,下面作为一个小白的我,想要把我的经验分享给大家,希 ...

  2. (微信支付签名失败)微信支付v2版本踩坑-二次签名不同类型签名参数key不同

    小伙伴们在做微信支付对接的时候会遇到各种各样的坑,特别是微信支付v2版本,微信支付的二次签名官方文档没有给出明显的签名参数,导致在开发中很容易碰到微信支付的这个坑(微信支付签名失败),app签名key ...

  3. 关于微信支付(二维码支付)

    关于微信支付(一) 微信支付有两种方式 1.第三方网站弹出二维码客户扫描支付 2.在微信内部H5直接发起支付 这篇文章先讲 第一种最常用的 弹出二维码支付 二维码支付 大概流程如下 用户选择支付-&g ...

  4. android WebView套壳 H5微信支付

         看博客,首先得看日期,首先吐槽下,第一次做webview  套壳的android  APP  ,项目有微信支付这一块,就百度搜 看别人的博客,有的说android  webview H5 微 ...

  5. 微信二维码支付支付宝二维码支付(主扫模式)开发指南

    微信二维码支付 熟悉微信支付全家桶的童鞋应该都清楚,微信支付是没有提供PC网关支付的,那么传统的网站需要怎么接入微信支付产品呢? 我们可以选择微信支付中的Native支付产品,官方介绍: Native ...

  6. android实现第三方支付,Android开发第三方APP接入微信支付

    前言 在APP中接入微信支付其实很简单,大部分工作主要都是后台完成,客户端只需要调用后台,得到后台返回的字符串后在调用微信的api即可.但是会有些坑,稍不注意就会掉坑里,下面会讲到. 一. 接入流程 ...

  7. 微信支付项目四:微信支付笔记

    1. 微信支付项目四:微信支付交付 文章目录 1. 微信支付项目四:微信支付交付 1.1. 微信支付交付方式 1.2. 互联网架构知识时序图 1.3. 微信支付模式二的时序图 1.4. 微信支付订单接 ...

  8. java微信支付v3系列——7.微信支付之申请退款

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  9. 微信支付接口怎么申请 微信支付接口申请教程

     微信支付接口:点击进去 一直让大家翘首以盼的微信最核心的杀手锏--"微信支付"终于开放申请了!今天微信团队在官网发布消息,微信公众平台支付功能已正式开放申请,已开通公众号的 ...

  10. JAVA PC端扫码支付(一)微信支付

    微信支付从配置到开发 一.配置 1.开通公众平台支付功能 商户号 微信支付功能先要申请微信(企业)公众平台,然后开通企业公众平台付功能.下图为微信(企业)公众平台页面,可以看到商户号等信息 微信公众号 ...

最新文章

  1. 博士Nature发文:研究生阶段,4点经验助你学术“独立”!
  2. 计算机计算能力,计算机/电脑为什么拥有计算能力
  3. Blog_Backup:绿色博客备份工具
  4. xftp怎么有root权限_许多人都不懂的Linux系统里的特殊权限!!你真的了解嘛?...
  5. 【模拟】交换(jzoj 1518)
  6. 基于live555的视频直播 DM368IPNC RTSP分析
  7. mysql 冗余外键 同步_由于外键约束导致mysql同步出问题的故障
  8. java语音jvm_java环境中基于jvm的两大语言:scala,groovy
  9. log.py——打印出独立IP,并统计独立IP数
  10. Python 字符串类型格式化
  11. 自由职业者的八大挑战
  12. 独家深访陈光明:对内经营人才,对外经营信任
  13. ad15的stc元件库_AltiumDesigner常用元件库
  14. 《智慧书》格言大全(1-300)
  15. 网络安全等级保护三级产品清单整理
  16. Blackice.C病毒分析
  17. android9手机电池管家,腾讯电池管家APP
  18. 查看本机mysql安装信息
  19. 群接龙脚本autojs总结and精美ui
  20. Python:实现doomsday末日算法(附完整源码)

热门文章

  1. jquery 事件冒泡的介绍
  2. Deep manta算法解析
  3. leetcode之逆波兰表达式
  4. 在vue中实现锚点定位功能
  5. nginx配置虚拟主机-端口号区分/域名区分
  6. Jmeter安装+配置+运行
  7. bzoj 1603 打谷机
  8. 开发平台(Platform Builder 和 Embedded Visual C++)简介
  9. 为什么我推荐ImageJ?
  10. 【算法学习】【图像增强】【Retinex】White Patch Retinex