Android 集成微信支付详解

打包后才能起调支付 

微信支付成功起调

微信skd下载:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1

签名APK下载:https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk

1、首先到微信.开放平台创建账号,登录

微信开放平台:https://open.weixin.qq.com/

2、创建应用,申请微信支付权限

申请通过,填写  资料审核——审核通过如下:

 

3、微信支付  入驻申请通过会受到邮件如下:两个支付要用到的参数,商户号和APPID

这是点击前往操作,进入微信支付。商户平台

 

 

点击设置密钥,完成设置密钥并保持密钥,这个密钥是微信支付的第三个参数,也是最后一个参数。

只需APPID 、商户号、密钥;三个参数即可完成微信支付

4、微信支付六个工具类:

 

 

 

public class Constants {// appidpublic static final String APP_ID = "wx1201a018f113ce4";// 商户号public static final String MCH_ID = "1516571378";/*** 微信开放平台和商户约定的支付密钥** 注意:不能hardcode在客户端,建议genSign这个过程由服务器端完成*/public static final String APP_KEY = "01b2e2bd222e0db0c3765609ebc9b59f";}

、、、、、、、、、、、、、、、、、、、、、、、、、

public class MD5 {private MD5() {}public final static String getMessageDigest(byte[] buffer) {char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };try {MessageDigest mdTemp = MessageDigest.getInstance("MD5");mdTemp.update(buffer);byte[] md = mdTemp.digest();int j = md.length;char str[] = new char[j * 2];int k = 0;for (int i = 0; i < j; i++) {byte byte0 = md[i];str[k++] = hexDigits[byte0 >>> 4 & 0xf];str[k++] = hexDigits[byte0 & 0xf];}return new String(str);} catch (Exception e) {return null;}}
}

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {private IWXAPI api;//    public static final String APP_ID = "wxf660cc9ea105ccae";public static final String APP_ID = "wx1201a018f11dcec6";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);api = WXAPIFactory.createWXAPI(this, APP_ID);api.handleIntent(getIntent(), this);}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);setIntent(intent);api.handleIntent(intent, this);}@Overridepublic void onReq(BaseReq req) {}@Overridepublic void onResp(BaseResp resp) {if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {//回调结果if (resp.errCode == 0) { Toast.makeText(WXPayEntryActivity.this,"支付成功", Toast.LENGTH_LONG).show();
//                BaseApplication.isPay = true;//设置标志为支付完成
//                if (BaseApplication.pay_Flag == 1) {
//                    RechargeActivity.updateData();
//                } else if (BaseApplication.pay_Flag == 2) {
//                    UpgradePayActivity.updateData();
//                } else if (BaseApplication.pay_Flag == 3) {
//                    BuyPeachActivity.updateData();
//                }} else if (resp.errCode == -2) {Toast.makeText(WXPayEntryActivity.this,"支付取消", Toast.LENGTH_LONG).show();}finish();}}}

 

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

public class PayWechatManager {private final String TAG = "PayWechatManager";private Context context;// APPIDpublic String APP_ID;// 商户号private String MCH_ID;// API密钥,在商户平台设置private String API_KEY;private String orderOn;private String productfeeName;private String price;private String orderType;// 支付结果回调(通知后台服务器)private String callBackUrl;public PayWechatManager(Context context) {this.context = context;}/*** @param APP_ID* @param MCH_ID* @param API_KEY* @param orderOn* @param productfeeName* @param price* @param callBackUrl* @param orderType      //附加参数,不传为null。不能为""*/public void toWeChatPay(String APP_ID, String MCH_ID, String API_KEY, String orderOn, String productfeeName, String price, String callBackUrl, String orderType) {this.APP_ID = APP_ID;this.MCH_ID = MCH_ID;this.API_KEY = API_KEY;this.orderOn = orderOn;this.productfeeName = productfeeName;this.price = price;this.callBackUrl = callBackUrl;this.orderType = orderType;// 附加数据GetPrepayIdTask getPrepayId = new GetPrepayIdTask();getPrepayId.execute();}/*** 异步任务,提交订单(发起支付)*/class GetPrepayIdTask extends AsyncTask<Void, Void, Map<String, String>> {@Overrideprotected void onPreExecute() {// ui.showLoadingDialog();}@Overrideprotected Map<String, String> doInBackground(Void... params) {String url = String.format("https://api.mch.weixin.qq.com/pay/unifiedorder");// 创建微信订单信息String entity = createWeChatOrder();Log.i("lgq","微信得到==="+entity);// 生成微信订单byte[] buf = HttpWxUtile.httpPost(url, entity);// 这里容易出错误,错误信息请见:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=9_3&index=5String content = new String(buf);Log.i("lgq","微信返回=----==="+content);Map<String, String> xml = decodeXml(content);return xml;}@Overrideprotected void onPostExecute(Map<String, String> result) {/** 用于存储支付信息的StringBuffer(用于打印订单信息) */StringBuffer sbInfo = new StringBuffer();sbInfo.append("prepay_id\n" + result.get("prepay_id") + "\n\n");createPayReq(result, sbInfo);}}/*** 根据您的订单信息 生成 微信产品支付订单信息*/private String createWeChatOrder() {StringBuffer xml = new StringBuffer();try {String nonceStr = genNonceStr();xml.append("</xml>");List<KeyValue> packageParams = new LinkedList<KeyValue>();packageParams.add(new KeyValue("appid", APP_ID));packageParams.add(new KeyValue("attach", orderType));packageParams.add(new KeyValue("body", "天鑫计费-网吧充值"));packageParams.add(new KeyValue("mch_id", MCH_ID));packageParams.add(new KeyValue("nonce_str", nonceStr));packageParams.add(new KeyValue("notify_url", callBackUrl));packageParams.add(new KeyValue("out_trade_no", orderOn));packageParams.add(new KeyValue("spbill_create_ip", "127.0.0.1"));packageParams.add(new KeyValue("total_fee", getTotalFee(price)));// packageParams.add(new KeyValue("total_fee", price));packageParams.add(new KeyValue("trade_type", "APP"));String sign = genPackageSign(packageParams);packageParams.add(new KeyValue("sign", sign));String xmlstring = toXml(packageParams);return xmlstring;//            return new String(xmlstring.toString().getBytes(), "ISO8859-1");// return xmlstring;} catch (Exception e) {return null;}}/*** doingBackground*/private Map<String, String> decodeXml(final 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) {}return null;}// 将totalfee从单位(元)装换成整数的(分)private String getTotalFee(String total_fee) {total_fee = Double.valueOf(total_fee) * 100 / 1 + "";total_fee = total_fee.substring(0, total_fee.indexOf("."));return total_fee;}private String toXml(List<KeyValue> params) {StringBuilder sb = new StringBuilder();sb.append("<xml>");for (int i = 0; i < params.size(); i++) {sb.append("<" + params.get(i).getName() + ">");sb.append(String.valueOf(params.get(i).getValue()));sb.append("</" + params.get(i).getName() + ">");}sb.append("</xml>");return sb.toString();}private String genNonceStr() {Random random = new Random();return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());}private long genTimeStamp() {return System.currentTimeMillis() / 1000;}/*** 创建订单支付请求*/private void createPayReq(final Map<String, String> orderInfo, StringBuffer sbInfo) {PayReq req = new PayReq();req.appId = APP_ID;req.partnerId = MCH_ID;req.prepayId = orderInfo.get("prepay_id");req.packageValue = "Sign=WXPay";req.nonceStr = genNonceStr();req.timeStamp = String.valueOf(genTimeStamp());List<KeyValue> signParams = new LinkedList<KeyValue>();signParams.add(new KeyValue("appid", req.appId));signParams.add(new KeyValue("noncestr", req.nonceStr));signParams.add(new KeyValue("package", req.packageValue));signParams.add(new KeyValue("partnerid", req.partnerId));signParams.add(new KeyValue("prepayid", req.prepayId));signParams.add(new KeyValue("timestamp", req.timeStamp));req.sign = genAppSign(sbInfo, signParams);sbInfo.append("sign\n" + req.sign + "\n\n");// 发起支付sendPayReq(req);}// 发起支付,当前页面结束private void sendPayReq(final PayReq req) {IWXAPI wxApi = WXAPIFactory.createWXAPI(context, null);wxApi.registerApp(req.appId);wxApi.sendReq(req);}/*** 生成签名*/@SuppressLint("DefaultLocale")private String genPackageSign(List<KeyValue> 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(API_KEY);String packageSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();return packageSign;}@SuppressLint("DefaultLocale")private String genAppSign(StringBuffer sbInfo, List<KeyValue> 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(API_KEY);sbInfo.append("sign str\n" + sb.toString() + "\n\n");String appSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();return appSign;}class KeyValue {private String name;private String value;public KeyValue(String name, String value) {this.name = name;this.value = value;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}}}

5、配置微信activity

<activityandroid:name=".wxapi.WXEntryActivity"android:configChanges="keyboardHidden|orientation|screenSize"android:exported="true"android:screenOrientation="portrait"android:theme="@android:style/Theme.Translucent.NoTitleBar" /><activityandroid:name=".wxapi.WXPayEntryActivity"android:exported="true"android:launchMode="singleTop" />

6、起调微信支付:

demo链接:https://download.csdn.net/download/meixi_android/10726688

 

在线回复解决bug:qq1085220040

//微信支付
private void wechat() {new PayWechatManager(LiteActivity.this).toWeChatPay(Constants.APP_ID, Constants.MCH_ID,Constants.APP_KEY, getTime(), "天鑫计费-网吧充值", "0.01","http://yohoweb.91yohoo.com", null);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/415088.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作184:自定义事件

1子组件 mongo.vue <template><button click"eat">按钮</button> </template><script> export default {created() {this.$on("eat", function(fruit) {console.log("子组件接收自己发射的事件");});},methods:…

cesium label 显示隐藏到地底下

今天在写label的时候&#xff0c;发现高度为0时&#xff0c;label显示不全&#xff0c;影响用户体验&#xff0c;代码如下&#xff1a; window.labelEntity viewer.entities.add({label: {show: false,showBackground: true,font: "14px monospace",horizontalOrigi…

jq循环取数据 ,一直记不住,放到这

<!DOCTYPE html><html lang"en"><head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0, user-scalableno"> <title>首页</title> &l…

工作185:解决vue+el-element二级联动,选项选择后不显示的问题

一、问题描述 vue的二级联动可以采用v-if的方式去实现&#xff0c;也就是在第一级选项的值发生变化后&#xff0c;清空第二级选项所关联的model的值&#xff0c;并将第二级选项所取的变量数组变更。会产生的问题是&#xff0c;第二级选项的值有时候会出现值已改变但是页面上并不…

mongodb在aggregate lookup 进行分页查询,获得记录总数

直接上代码&#xff1a; const ones await InspectTaskUser.aggregate([{$facet: {paginatedResult: [{ $match: { user_id: ObjectId(_id) } },{ $skip: (page - 1) * size },{ $limit: size },{$lookup: {from: inspecttasks,localField: task_id,foreignField: _id,as: tas…

vmware安装centos问题

* 选择安装后&#xff0c;一直黑屏 重新启动电脑&#xff0c;在启动界面进入BIOS设置&#xff0c;找到Intel (R) Virtualization Technology&#xff0c;设置成Enabled&#xff0c;保存设置以后重新启动电脑&#xff0c;问题解决。转载于:https://www.cnblogs.com/gaotaozhaole…

工作186:实际案例解决vue+el-element二级联动,选项选择后不显示的问题

1组件 <el-form-item label"所属部门" :label-width"formLabelWidth"><select-form change"DepartmentList" v-model"form.department_id" /></el-form-item><!-- <el-form-item prop"business_module&…

Render errors:One or more layouts are missing the layout_width or layout_height attributes

Render errors:One or more layouts are missing the layout_width or layout_height attributes 2017年05月25日 11:55:19 邹奇 阅读数&#xff1a;4207 标签&#xff1a; android studioxmlRendererrorsattributes 更多 个人分类&#xff1a; 安卓开发技术学习 版权声明&a…

fastapi vue socket 从其他文件调用 socket 方法

需求&#xff1a;因为项目需要&#xff0c;边做边学python&#xff0c;这次需要使用socket功能&#xff0c;正常在main.py中写个socket&#xff0c;还是OK的&#xff0c;但是我想要在其他文件中&#xff0c;直接使用socket的emit方法&#xff0c;需要在文件结构上进行一些调整。…

工作187:表单校验规则

第一种常用方式&#xff1a;表单上加rules&#xff5b;object&#xff5d; <el-form class"apply-form first-form" :model"formData" :rules"rule" ref"form"><el-form-item label"姓名" prop"visitorName&…

AndroidStudio关联svn并上传代码到svn服务器上,更换域名

SVN安装选项 到下图位置选择【command line client tools】前面的下拉框&#xff0c;选择【Will be installed on local hard drive】&#xff0c;一直下一步知道安装完成即可。 打开AndroidStudio&#xff0c;按CtrlShifS快捷键&#xff0c;进入Settings设置页面。如上图所示…

docker安装postgres

1、拉取 postgres镜像 docker pull postgres2、开启容器 docker run --name Postgres-0 -e POSTGRES_PASSWORDpassword -d -p 5432:5432 postgres:latest3、打开命令行 docker exec -it Postgres-0 bash4、切换为管理员用户 psql -U postgres5、查看用户 \du6、继续创建数…

MySQL并发复制系列一:binlog组提交 (转载)

http://blog.csdn.net/woqutechteam/article/details/51178803 MySQL Binary log在MySQL 5.1版本后推出主要用于主备复制的搭建&#xff0c;我们回顾下MySQL 在开启/关闭 Binary Log功能时是如何工作的 。 MySQL没有开启Binary log的情况下&#xff1a; InnoDB存储引擎通过re…

工作188:表单校验规则

1绑定rules <el-dialog title"新建账号" :visible.sync"dialogFormVisible" close"close"><!--1.name--><el-form ref"form" :rules"rules" :model"form" size"medium" :label-width&q…

学习knex过程中好的参考资料整理

记录本人制作博客系统和学习knex找的相关资料链接&#xff1a; 1、博客系统 https://github.com/huoguozhang/my-blog/tree/master/models 2、与typescript结合&#xff0c;TypeScript Express Objection.js Knex.js MySQL https://github.com/corocn/ts-server/tree/61c…

js-----Date==字符串

<html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"> <title>js将当前时间转换为字符串日期</title> <script type"text/javascript" src"jquery-1.11.1.min.js"&…

Android Studio 项目断开SVN连接

Android Studio 断开 SVN 1.打开项目所在的文件夹&#xff0c;找到.idea文件夹 2.打开.idea文件夹&#xff0c;找到vcs.xml文件并打开 3.把vcs对应的值删掉&#xff0c;vcs“” 4.重要的来了&#xff0c;删除项目中关联svn时创建的svn隐藏文件。 在查看中设置显示隐藏的文…

工作189:配置表头即可

columns: [{type: "selection", width: "50"},{prop: "id", label: "ID", width: "60", sortable: true},{prop: "name", label: "账号名称", width: "100", sortable: true},{prop: "d…

什么是eager loading

在做objectionknexmysql技术栈开发过程中&#xff0c;进行关联数据查询时&#xff0c;遇到这个关键词eager loading,现在进行解释一下&#xff1a; eager loading其实就是preloading的意思。就是尽可能把后面需要的数据&#xff0c;通过最少的sql语句一起查询出来&#xff0c;从…

Robotium_断言方法assert、is、search

下面的这些方法都主要用来判断测试结果是否与预期结果相符&#xff0c;一般把is和search方法放在assert里面判断。assert最常用的还是assertThat方法&#xff0c;是Junit的判断&#xff0c;这里就不多说了。断言方法assert&#xff08;robotium特有的断言方式&#xff0c;实际项…