Android实现微信支付功能

开发Android APP微信支付功能,需要完成三个步骤:第一步生成预支付订单、第二步生成微信支付参数、第三步调起微信APP支付。除了需要审核通过的APP应用外,还需要获得微信支付接口权限,然后获取对应的商户号、API密钥,这两者缺一不可,并且在APP微信支付中使用

获得商户号、API密钥

在微信开放平台中查看审核通过的APP应用,是否申请支付功能,若已申请,登录微信支付|商户平台:http://pay.weixin.qq.com 查看对应的商户号、API密钥

》申请微信支付接口

》登录商户平台

》查看商户号

》获取API密钥

第一步:生成预支付订单

将商品信息、商户信息使用BasicNameValuePair存放,然后存储在List列表中,并构造成xml字符串格式,以POST方式微信提供的接口:https://api.mch.weixin.qq.com/pay/unifiedorder 发送数据,接收返回信息,获取prepay_id预支付订单编号

》生成订单请求

private String genProductArgs() {
 StringBuffer xml = new StringBuffer(); 

 try {
 String nonceStr = genNonceStr(); 

 xml.append("</xml>");
 List<NameValuePair> packageParams = new LinkedList<NameValuePair>();
 packageParams
  .add(new BasicNameValuePair("appid", Constants.APP_ID));
 packageParams.add(new BasicNameValuePair("body", "weixin"));
 packageParams
  .add(new BasicNameValuePair("mch_id", Constants.MCH_ID));
 packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));
 packageParams.add(new BasicNameValuePair("notify_url",
  "http://121.40.35.3/test"));
 packageParams.add(new BasicNameValuePair("out_trade_no",
  genOutTradNo()));
 packageParams.add(new BasicNameValuePair("spbill_create_ip",
  "127.0.0.1"));
 packageParams.add(new BasicNameValuePair("total_fee", "1"));
 packageParams.add(new BasicNameValuePair("trade_type", "APP")); 

 String sign = genPackageSign(packageParams);
 packageParams.add(new BasicNameValuePair("sign", sign)); 

 String xmlstring = toXml(packageParams); 

 return xmlstring; 

 } catch (Exception e) {
 Log.e(TAG, "genProductArgs fail, ex = " + e.getMessage());
 return null;
 } 

 }

》获取预支付订单编号

String url = String.format("https://api.mch.weixin.qq.com/pay/unifiedorder");
 String entity = genProductArgs(); 

 Log.e("orion", entity); 

 byte[] buf = Util.httpPost(url, entity); 

 String content = new String(buf);
 Log.e("orion", content);
 Map<String, String> xml = decodeXml(content); 

第二步:生成微信支付参数

appId对应APP应用的APPID,partnerId对应商户号,prepayId对应第一步获得的预支付订单,packageValue取值Sign=WXPay,nonceStr是一串随机数,timeStamp生成的时间戳,sign对应APP签名

》支付参数配置

private void genPayReq() { 

 req.appId = Constants.APP_ID;
 req.partnerId = Constants.MCH_ID;
 req.prepayId = resultunifiedorder.get("prepay_id");
 req.packageValue = "Sign=WXPay";
 req.nonceStr = genNonceStr();
 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"); 

 show.setText(sb.toString()); 

 Log.e("orion", signParams.toString()); 

 } 

》nonceStr随机数

private String genNonceStr() {
 Random random = new Random();
 return MD5.getMessageDigest(String.valueOf(random.nextInt(10000))
 .getBytes());
 }

》timeStamp时间戳

private long genTimeStamp() {
 return System.currentTimeMillis() / 1000;
 }

》APP签名

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())
 .toUpperCase();
 Log.e("orion", appSign);
 return appSign;
 }

第三步:调起微信APP支付

支付之前,需要手机安装微信客户端,如果没有,会提示下载安装微信,然后再调起支付,在AndroidManifest.xml文件中添加如下配置

<activity
 android:name=".act.PayActivity"
 android:exported="true"
 android:launchMode="singleTop" >
 <intent-filter>
 <action android:name="android.intent.action.VIEW" /> 

 <category android:name="android.intent.category.DEFAULT" /> 

 <data android:scheme="wxf2f565574a968187" />
 </intent-filter>
 </activity>

》调起微信支付

private void sendPayReq() { 

 msgApi.registerApp(Constants.APP_ID);
 msgApi.sendReq(req);
 }

接收微信返回结果

在实现了IWXAPIEventHandler接口的Activity中重写onResp(BaseResp)方法,接收微信结果

》接收支付结果

public void onResp(BaseResp resp) {
 Log.d(TAG, "onPayFinish, errCode = " + resp.errCode); 

 if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
 AlertDialog.Builder builder = new AlertDialog.Builder(this);
 builder.setTitle(R.string.app_tip);
 builder.setMessage(getString(R.string.pay_result_callback_msg,
  resp.errStr + ";code=" + String.valueOf(resp.errCode)));
 builder.show();
 }
 }

本文已被整理到了《Android微信支付教程汇总》,《Android微信开发教程汇总》,欢迎大家学习阅读。

以上就是本文的全部内容,希望对大家的学习有所帮助。

(0)

相关推荐

  • android微信支付源码分享

    本文为大家分享了android微信支付源码,供大家参考,具体内容如下 参数配置 public static final String APP_ID ; /** 在微信开放平台注册app,微信给分配的id **/ public static final String MCH_ID; /** 申请开通微信支付,成功后微信会给你发一封邮件,给你分配一个商户平台账号,在资料里有商户ID **/ public static final String API_KEY; /** 在微信发给你的那封邮件里,给你

  • Android—基于微信开放平台v3SDK开发(微信支付填坑)

    接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束...进入正题 开发准备: 1.在微信开放平台申请账号 2.成功后创建应用,就是填一些看似很官方很正经的资料了...(说审核7天左右,没有意外的情况下你的app第二天就审核成功了是不是很开心,有了appid,是不是就可以调用微   信支付了????-------想多了,真的) 3.微信支付是需要额外

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

    本文实例讲述了Android编程实现的微信支付功能.分享给大家供大家参考,具体如下: 最近公司弄Ionic框架,项目中需要微信支付,无奈,把我调过去弄,期间也是几近崩溃,好在皇天不负有心人,在看别人的文档,终于是在项目中集成了微信支付,下面作为一个小白的我,想要把我的经验分享给大家,希望对大家有所帮助. 先给一个可用的demo吧(运行前先看txt文件) demo代码点击此处本站下载. 这个demo是基于eclipse开发的,博主也在Android Studio开发过微信支付,原理都是一样的,大家

  • Android仿支付宝微信支付密码界面弹窗封装dialog

    一,功能效果 二,实现过程 1,先写xml文件:dialog_keyboard.xml 注意事项 (1),密码部分用的是一个线性布局中6个TextView,并设置android:inputType="numberPassword",外框是用的一个有stroke属性的shape, (2),1-9数字是用的recycleview ,每个item的底部和右边有1dp的黑线,填充后形成分割线. (3),recycleview 要设置属性  android:overScrollMode=&quo

  • Android支付宝和微信支付集成

    场景 随着移动支付的兴起,在我们的app'中,会经常有集成支付的需求.这时候一般都会采用微信和支付宝的sdk 来集成 (一)支付宝支付 在使用支付宝支付的过程中,我们是在服务器端生成订单,客户端访问接口,并得到订单信息,调用接口支付,支付成功后支付宝会分别 异步调用服务器端,并向客户端返回支付结果. 开发步骤: ①注册支付宝账号--进行实名认证--提交审核资料--审核通过 支付宝无线快捷支付接口: b.alipay.com/order/productDetail.htm?productId=20

  • Android微信支付开发问题

    并不是所有的BAT的API都是非常好用的,微信支付就有不少的缺陷,总结一下微信支付实现中出现的问题   坑点一: PayReq的参数 sign的生成   PayReq对象有个参数为packageValue 而sign生成时要用到packageValue,但是对应的Key是package,这里的key容易弄错 复制代码 代码如下: List<NameValuePair> signParams = new LinkedList<NameValuePair>();         sig

  • Android集成微信支付功能

    准备工作这里就不说了,包括签约和申请APPID,附上微信开放平台APP开发步骤,不懂的同学可以参考这里: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5 上面的步骤很详细,这里主要说下调起支付的注意事项.按照上面文档中说的商户服务器生成支付订单,先调用统一下单API生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付. 相关代码如下: /** * 商户服务器生成支付订单,先调用统一下单API(详见第

  • Android第三方微信支付教程

    做了微信支付,下载了Demo,发现和之前有所改动,v3.0的版本,也许有的朋友还在摸索,这里我已经成功支付,话不多说,直接进入主题: 一.首先要在微信开发平台注册账号,新增应用,填写正确的包名,正确的签名(MD5中的一串字符冒号去掉,全部小写),当然也会生成的AppID和AppSecret都有用!最后还要花300大洋开通支付功能! 二.分析一下微信支付的流程 三.界面交互流程 上面都看明白了,接下来就是写代码了 四.这里必须要有wxapi这个包名,同时必须有WXPayEntryActivity这

  • Android仿微信支付密码弹出层功能

    预览 使用 这个弹出层是一个DialogFragment,逻辑都封装在其内部,使用起来很简单: Bundle bundle = new Bundle(); bundle.putString(PayFragment.EXTRA_CONTENT, "提现:¥ " + 100.00); PayFragment fragment = new PayFragment(); fragment.setArguments(bundle); fragment.setPaySuccessCallBack(

  • Android 支付宝支付、微信支付、银联支付 整合第三方支付接入方法(后台订单支付API设计)

    客户端获取后台支付API请求参数的设计 参数样例: { data: { method: 1, platform: 1, version:"1.0", relate_orders:"B201602031023,B2016020310231", order_no: "BZY201604200952100", order_type: 1, total_fee: 1, description: "商品购买", client_ip:'1

  • Android微信支付获取二次签名Sign的方法

    本文实例为大家分享了Android微信支付获取二次签名Sign的方法,供大家参考,具体内容如下 /** * 获取sign签名 * * @return */ private String genPayReq() { // 获取参数的值 PayReq request = new PayReq(); request.appId = ConstantsMember.APP_ID; request.partnerId = ConstantsMember.MCHID; request.prepayId =

随机推荐