博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android微信支付SDK开发
阅读量:6255 次
发布时间:2019-06-22

本文共 4889 字,大约阅读时间需要 16 分钟。

一、准备工作

1、开发平台及SDK下载

微信开放平台

下载SDK

微信支付Demo下载

 

2、创建应用

创建移动应用获取 AppID  AppSecret

要获取支付功能还需要开发者资质认证,300RMB/年的费用,貌似是开放平台中唯一要收费的…

 

3、AndroidMainfest文件修改

权限

  

二、业务流程

商户系统和微信支付系统主要交互说明:

步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。

步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【】。

步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay

步骤4:商户APP调起微信支付。api参见本章节【】

步骤5:商户后台接收支付通知。api参见【】

步骤6:商户后台查询支付结果。,api参见【】

 

三、开发

1、注册应用

final IWXAPI msgApi = WXAPIFactory.createWXAPI(this, null);msgApi.registerApp(Constants.APP_ID);

  

2、调用支付统一下单接口,并返回PrepayID

private class GetPrepayIdTask extends AsyncTask
> {         private ProgressDialog dialog;         @Override        protected void onPreExecute() {            dialog = ProgressDialog.show(PayActivity.this, getString(R.string.app_tip), getString(R.string.getting_prepayid));        }         @Override        protected void onPostExecute(Map
result) {            if (dialog != null) {                dialog.dismiss();            }            sb.append("prepay_id\n"+result.get("prepay_id")+"\n\n");            show.setText(sb.toString());            resultunifiedorder=result;        }         @Override        protected void onCancelled() {            super.onCancelled();        }         @Override        protected Map
  doInBackground(Void... params) {            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
xml=decodeXml(content);            return xml;        }    }
设置统一下单参数:
private String genProductArgs() {        StringBuffer xml = new StringBuffer();        try {            String  nonceStr = genNonceStr();            xml.append("");           List
packageParams = new LinkedList
();            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", "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;        }      }

  

3、设置PayReq请求的参数,并发送支付请求

//设置PayReq请求的参数private void genPayReq() {        req.appId = Constants.APP_ID;        req.partnerId = Constants.MCH_ID;        req.prepayId = resultunifiedorder.get("prepay_id");        req.packageValue = "prepay_id="+resultunifiedorder.get("prepay_id");        req.nonceStr = genNonceStr();        req.timeStamp = String.valueOf(genTimeStamp());         List
signParams = new LinkedList
();        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());     }

 

//发送请求msgApi.sendReq(req);

 

4、处理结果回调

实现微信API的IWXAPIEventHandler接口

api.handleIntent(getIntent(), new IWXAPIEventHandler);

在IWXAPIEventHandler的onResp(BaseResp resp)中处理请求回调

@Override    public void onResp(BaseResp resp) {        Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);         if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {                    //处理PayReq的回调        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();    }}

  

转载地址:http://mbnsa.baihongyu.com/

你可能感兴趣的文章
计算机网络与Internet应用
查看>>
Mars说光场(3)— 光场采集
查看>>
Django 文件下载功能
查看>>
走红日本 阿里云如何能够赢得海外荣耀
查看>>
HTML DOM 之 DOM对象:Document Object Model (文档对象模型)
查看>>
qt 学习之路2
查看>>
线上应用故障排查之二:高内存占用
查看>>
第四次作业
查看>>
异常处理汇总 ~ 修正果带着你的Code飞奔吧!
查看>>
BFS --- 素数环
查看>>
PCIE_DMA:xapp1052学习笔记
查看>>
python ----字符串基础练习题30道
查看>>
uva-10879-因数分解
查看>>
python 调用aiohttp
查看>>
Spring Boot中使用MyBatis注解配置详解
查看>>
linux下文件的一些文件颜色的含义
查看>>
跨域iframe高度自适应(兼容IE/FF/OP/Chrome)
查看>>
如何花更少的时间学习更多的知识
查看>>
学习鸟哥的Linux私房菜笔记(8)——文件查找与文件管理2
查看>>
升级fedora 18到fedora 19
查看>>