官方集成文档地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5#

一、在您 App Module 的 build.gradle 中,添加下面的内容,将微信 SDK 作为项目依赖:

dependencies {//添加下面的内容implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'//...其他依赖项
}

二、在项目中创建wxapi文件夹,在其下创建WXPayEntryActivity类。

三、在清单文件AndroidManifest.xml的application标签中配置如下代码:

<activityandroid:name=".wxapi.WXPayEntryActivity"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="你的appid"/></intent-filter></activity>

至此。配置就结束了,接下来上具体代码演示:

首先,订单的加密下单都应在后台操作,所以先调用自己后台的接口,传递相应参数给后台,可以使其携带参数调取微信的接口,达到成功下单,成功下单后,微信会返回一个xml数据串,但这个数据串不能直接让移动端调取微信sdk支付,需要再签名一下,可以让后台直接完成。但我这是自己移动端进行了签名,用到的工具类,以下也已提供WXPaySignUtil类,MD5Util类。

WXPayEntryActivity类

public class WXPayEntryActivity extends BaseActivity implements IWXAPIEventHandler {private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";@BindView(R.id.wechat_paysucced_tv)TextView wechatPaysuccedTv;@BindView(R.id.wechat_sure_btn)TextView wechatSureBtn;private IWXAPI api;@Overrideprotected int getLayoutID() {return R.layout.pay_result;}@Overridepublic void initView() {api = MyApplication.getWXapi();try {if (!api.handleIntent(getIntent(), this)) {finish();}} catch (Exception e) {e.printStackTrace();}TextView wechatSureBtn = findViewById(R.id.wechat_sure_btn);wechatSureBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startActivity(new Intent(WXPayEntryActivity.this, ModelTwoRegistrationActivity.class));finish();}});}@Overridepublic void initPresenter() {}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);setIntent(intent);api.handleIntent(intent, this);}@Overridepublic void onReq(BaseReq req) {}@Overridepublic void onResp(BaseResp resp) {int code = resp.errCode;switch (code) {case 0://支付成功wechatPaysuccedTv.setText("支付成功");wechatSureBtn.setText("完成");break;case -1://支付失败("签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、您的微信账号异常等。")wechatPaysuccedTv.setText("支付失败:-1");wechatSureBtn.setText("返回");break;case -2://用户取消支付后的界面wechatPaysuccedTv.setText("支付失败,用户取消支付");showToast("用户取消支付");wechatSureBtn.setText("返回");break;}Log.e(TAG, "onPayFinish, errCode = " + resp.errCode + ", errStr = " + resp.errStr + ", openId = " + resp.openId + ",transaction = " + resp.transaction);//        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
//            AlertDialog.Builder builder = new AlertDialog.Builder(this);
//            builder.setTitle("支付结果");
//            builder.setMessage(getString(R.string.pay_result_callback_msg, String.valueOf(resp.errCode)));
//            builder.show();
//        }}@OnClick(R.id.wechat_sure_btn)public void onViewClicked() {Intent intent = new Intent(WXPayEntryActivity.this, ModelTwoRegistrationActivity.class);startActivity(intent);finish();}

回调中errCode值列表:

名称 描述 解决方案
0 成功 展示成功页面
-1 错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
-2 用户取消 无需处理。发生场景:用户不支付了,点击取消,返回APP。
WXPaySignUtil类
public class WXPaySignUtil {//对后台返回的预支付订单进行加密public static  Map<String, String> payInfo(String appId,String micId, String prepayId, String nonceStr, String timeStamp, String sign){SortedMap<String, String> signParam = new TreeMap<String, String>();signParam.put("appid", appId);//app_idsignParam.put("partnerid", micId);//微信商户账号signParam.put("prepayid", prepayId);//预付订单idsignParam.put("package", "Sign=WXPay");//默认sign=WXPaysignParam.put("noncestr", nonceStr);//自定义不重复的长度不长于32位signParam.put("timestamp",timeStamp);//北京时间时间戳String signAgain = createSign("UTF-8", signParam);//再次生成签名signParam.put("sign", signAgain);return signParam;}//定义签名,微信根据参数字段的ASCII码值进行排序 加密签名,故使用SortMap进行参数排序public static String createSign(String characterEncoding,SortedMap<String,String> parameters){StringBuffer sb = new StringBuffer();Set es = parameters.entrySet();Iterator it = es.iterator();while(it.hasNext()) {Map.Entry entry = (Map.Entry)it.next();String k = (String)entry.getKey();Object v = entry.getValue();if(null != v && !"".equals(v)&& !"sign".equals(k) && !"key".equals(k)) {sb.append(k + "=" + v + "&");}}sb.append("key=" + "f1a2s3d4g5r6e7g8g9a0gsXXXXwwwwsd");//最后加密时添加商户密钥,由于key值放在最后,所以不用添加到SortMap里面去,单独处理,编码方式采用UTF-8String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();return sign;}
}
MD5Util类
class MD5Util {private static String byteArrayToHexString(byte b[]) {StringBuffer resultSb = new StringBuffer();for (int i = 0; i < b.length; i++)resultSb.append(byteToHexString(b[i]));return resultSb.toString();}private static String byteToHexString(byte b) {int n = b;if (n < 0)n += 256;int d1 = n / 16;int d2 = n % 16;return hexDigits[d1] + hexDigits[d2];}public static String MD5Encode(String origin, String charsetname) {String resultString = null;try {resultString = new String(origin);MessageDigest md = MessageDigest.getInstance("MD5");if (charsetname == null || "".equals(charsetname))resultString = byteArrayToHexString(md.digest(resultString.getBytes()));elseresultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));} catch (Exception exception) {}return resultString;}private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5","6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
}

在application类中注册APPID

public class MyApplication extends LitePalApplication {private static Context mContext;public static final String APP_ID = "你的appid";private static IWXAPI api;public static Context getInstance() {return mContext;}@Overrideprotected void attachBaseContext(Context context) {super.attachBaseContext(context);MultiDex.install(context);}@Overridepublic void onCreate() {super.onCreate();mContext = this;}public static IWXAPI getWXapi() {return api;}
}
//普通商户版微信支付
public void wechatPay(String partnerId, String prepayId, String nonceStr, String timeStamp, String sign) {PayReq req = new PayReq();req.appId = MyApplication.APP_ID;//你的微信appidreq.partnerId = partnerId;//商户号req.prepayId = prepayId;//预支付交易会话IDreq.nonceStr = nonceStr;//随机字符串req.timeStamp = timeStamp;//时间戳req.packageValue = "Sign=WXPay";//扩展字段,这里固定填写Sign=WXPayreq.sign = sign;//签名req.extData = "app data"; // optional// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信MyApplication.getWXapi().sendReq(req);
}
//服务商版微信支付
public void wechatFwsPay(String appId, String mchId, String prepayId, String nonceStr, String timeStamp, String sign) {//服务商版支付PayReq req = new PayReq();req.appId = "wx8864d62b0167ecd8";//子商户appidreq.partnerId = "1554575261";//子商户号req.prepayId = prepayId;req.packageValue = "Sign=WXPay";req.nonceStr = nonceStr;req.timeStamp = timeStamp;req.sign = sign;// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信MyApplication.getWXapi().sendReq(req);
}

Android集成微信支付SDK,实现支付功能相关推荐

  1. Android集成微信支付

    Android集成微信支付 项目中集成第三方支付的功能,基本是我们app中经常用到的功能.今天先给大家讲一下微信支付的集成过程,重点只说一下代码部分.首先,你要到微信开发者平台注册账号,并创建你的应用 ...

  2. Android 集成微信支付和支付宝支付工具类

    Android 集成微信支付和支付宝支付工具类 1.前言 去年年底接了一个商城app 外包项目,里面尼涉及到 微信和支付宝支付,这里我整理出几个工具类,下面就和大家分享一下,废话不多说,下面我一步一步 ...

  3. Android集成微信登录

    Android集成微信登录是比较常见的了,此次我把自己集成的过程总结出来,供大家学习参考. 1.首先需要你去微信开放平台申请对应的APPID,地址https://open.weixin.qq.com/ ...

  4. android仿微信语音聊天功能,Android仿微信发送语音消息的功能及示例代码

    微信的发送语音是有一个向上取消的,我们使用ontouchlistener来监听手势,然后做出相应的操作就行了. 直接上代码: //语音操作对象 private mediaplayer mplayer ...

  5. java程序集成微信公众号模板消息功能

    要在 Java 程序中集成微信公众号模板消息功能,您需要按照以下步骤进行: 在微信公众平台上申请并获取您的公众号的 appid 和 appsecret. 使用 appid 和 appsecret 调用 ...

  6. Android 集成海康威视监控 SDK,实现监控录像的查看

    Android 集成海康威视监控 SDK,实现监控录像的查看 配置 切换Android studio 到project目录下,分别将jar包与armeabi包复制进去lib文件夹下: 设置app bu ...

  7. Android集成支付宝支付SDK,实现支付功能

    官方集成文档地址:https://docs.open.alipay.com/204/105296/ 一.导入支付宝SDK 1.将 alipaySdk-15.6.5-20190718211159.aar ...

  8. 微信支付 android4.4,Android集成微信支付

    我之前集成过Ping++这种第三方的支付,但没有单单针对微信官方的支付集成过,这次做遇到很多坑,记录下. 微信支付的过程: 首先在微信开放平台上申请AppID,在开放平台的应用管理中将你的应用启用支付 ...

  9. Android 集成微信支付和支付宝

    最近比较闲,公司项目更换后台,于是自己来研究微信支付和支付宝支付,把自己学习的过程写下来,以备以后查看. 注:要集成微信支付和支付宝功能,必须要有以下几个配置信息,而这写信息需要公司去微信支付和支付宝 ...

  10. Android集成微信支付之-天坑

    项目集成微信支付,折腾了三天左右,坑太多,做个简单记录 开通和主要原理不再讲了,参考微信支付官网 截个官网的业务流程图,下面好说明 1 支付结果回调(图中的17步) 支付结果回调,微信官方的说法是: ...

最新文章

  1. 一道看完答案你会觉得很沙雕的「动态规划算法题」
  2. 一封邮件, 就能看出你是不是足够专业
  3. 8类网线利弊_超6类网线和7类网线有何区别?有何用途?家用电脑,看这
  4. 使用JQuery Mobile实现手机新闻浏览器
  5. leetcode:203. 移除链表元素(两种方法)
  6. 格力电器:回购股份比例超3% 已耗资95.15亿元
  7. 苹果手机投屏win10电脑
  8. Python下载视频
  9. 图片实现裁剪功能vue-img-cutter
  10. Typescript - 安装与配置
  11. 构建线上线下一体化解决方案,旺小宝以AI赋能房企数智化营销|爱分析访谈
  12. 数据库原理第一章测验(标黑的为答案)
  13. 【java.lang.ref】当WeakReference的referent重写了finalize方法时会发生什么
  14. Android Studio 加载arr文件.arr文件
  15. Spring整合swagger
  16. Ubuntu下使用搜狗输入法候选字显示乱码问题的解决
  17. 中国石油大学《化工原理二》第二阶段在线作业
  18. arcgis表转excel一直失败_arcGIS中属性表怎么导出到EXCEL里|excel表格转shp数据丢失...
  19. 计算机底层是什么东西?
  20. html5移动手机页面怎么做自适应-来自于三人行慕课

热门文章

  1. 文件操作安全之-文件解析原理篇
  2. 导入式样式表CSS与链接式样式表CSS的区别
  3. java实现基本的购物车功能案例
  4. CES生产函数中参数的意义
  5. 4.1-4.3 什么是矩阵 矩阵的基本运算及性质
  6. python cannot import name ‘sysconfig‘ from ‘distutils‘
  7. java解析Excel里面的数据
  8. SpringBoot 封装返回类报错:No converter found for return value of type
  9. 这4个资源搜索网站,你可能还不知道,但非常的实用
  10. pdo_dblib.dll for php7,php_pdo_dblib.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家...