Android 微信支付开发流程

发表于:2017-11-10 17:00

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:展菲    来源:51Testing软件测试网采编

#
流程
分享:
  首先奉上调起支付页面截图
  002.png
  一:介绍
  项目中要用到支付功能,需要支付宝支付、微信支付、银联支付,所以打算总结一下,方便以后的查阅,也方便大家, 用到的地方避免再次被坑。
  今天我们就主要介绍一下微信支付,其他支付也写了对应教程,并且给出了连接。
  集成前首先要看看文档,微信支付开发文档里面有详细的字段和说明。
  微信支付是需要签名的,跟支付宝一样,可以在客户端签名,也可以在后台签名(当然,为了安全还是推荐在服务器上做签名,逻辑也比较好理解)
  二:业务流程
  以下是交互时序图,统一下单API、支付结果通知API和查询订单API等都涉及签名过程,调用都必须在商户服务器端完成。
  交互时序图
  商户系统和微信支付系统主要交互说明:
  1.用户在商户APP中选择商品,提交订单,选择微信支付。
  2.商户后台收到用户支付单,调用微信支付统一下单接口。
  3.统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appid,partnerid,prepayid,noncestr,timestamp,package。
  4.商户APP调起微信支付。
  5.商户后台接收支付通知。
  6.商户后台查询支付结果。
  三:下载微信SDK
  微信开放平台下载SDK
  建议把Android头文件和支付示例都下载下来
  下载微信SDK
  四:后台设置
  商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。设置界面在【开放平台】中的栏目【管理中心 / 修改应用 / 修改开发信息】里面。如下图:
  102.png
  应用包名:是在APP项目配置文件AndroidManifest.xml中声明的package值,例如DEMO中的。
  package="net.sourceforge.simcpux"
  应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串,如下图所示,绿色串即应用签名。
  签名工具下载地址
  https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk
  103.png
  net.sourceforge.simcpux 是项目包名
  五:导入开发SDK
  导入sdk流程同支付宝导入流程一样,这里就借用支付宝导入流程进行介绍。
  5.1 如果项目开发使用的Eclipse软件,导入步骤如下:
  1.将alipaySDK-20150602.jar包放入商户应用工程的libs目录下,如下图。
  201.png
  [图片上传中...(104.png-ea4547-1510284076514-0)]
  2.进入商户应用工程的Java Build Path,将libs目录下的alipaySDK-20150602.jar导入,如下图。
  202.png
  3.选中Order and Export,勾选alipaySDK-20150602.jar,如下图。
  203.png
  将上图的支付宝sdk更换成微信sdk即可
  5.2 如果项目开发使用的Android Studio软件,导入步骤如下:
  1.将微信SDK拷贝到项目libs文件夹下,如果没有libs文件夹,就新建一个。
  301.png
  2.如果sdk使用过程中,提示找不到文件。
  进行如下操作,选中sdk文件,右击选择Reveal in Finder
  302.png
  六:修改AndroidManifest.xml配置
  1.在商户应用工程的AndroidManifest.xml文件里面添加声明:
  <!--微信-->
  <activity
  android:name=".wxapi.WXPayEntryActivity"
  android:exported="true"
  android:launchMode="singleTop">
  </activity>
  和权限声明:
  <!--微信-->
  <uses-permission android:name="android.permission.INTERNET"/>
  到这里,微信支付的前期配置已经完成,下面需要完成支付代码编写。
  七:支付接口调用
  在点击支付按钮的点击事件中,我提供的是从后端获取订单字符串,然后调用支付宝接口,调起支付。
  需要在新线程中调用支付接口。代码如下:
  //    支付按钮
  public void onClick(View view) {
  //起一个线程
  Runnable payRunnable = new Runnable() {
  @Override
  public void run() {
  String data = null;
  PayBean payBean = new PayBean();
  payBean.setOrderTime("");
  String json = new Gson().toJson(payBean);
  //json为获取后端结果时需要提供给后端订单信息,例如:时间、金额、订单属性等
  Log.i("charge request", json);
  try {
  //data为后端返回数据,其中包括订单字符串
  data = postJson(CHARGE_URL, json);
  } catch (IOException e) {
  e.printStackTrace();
  }
  // Json解析data
  ChargeWXBean charge = new Gson().fromJson(data.replace("package", "packages"), ChargeWXBean.class);
  //在mHandler中处理微信调起支付和返回结果回调
  Message msg = new Message();
  msg.what = SDK_PAY_WECHAT;
  msg.obj = charge;
  mHandler.sendMessage(msg);
  }
  };
  // 必须异步调用
  Thread payThread = new Thread(payRunnable);
  payThread.start();
  }
  在mHandler中处理调起支付
  private Handler mHandler = new Handler() {
  public void handleMessage(Message msg) {
  if (msg.what == SDK_PAY_WECHAT) {
  ChargeWXBean charge =  (ChargeWXBean) msg.obj;
  String packsges = charge.getResult().getCredential().getPackages();
  String appid = charge.getResult().getCredential().getAppid();
  String partenerid = charge.getResult().getCredential().getPartnerid();
  String prepayid = charge.getResult().getCredential().getPrepayid();
  String noncestr = charge.getResult().getCredential().getNoncestr();
  String timestamp = charge.getResult().getCredential().getTimestamp();
  String sign = charge.getResult().getCredential().getSign();
  //              商户APP工程中引入微信JAR包,调用API前,需要先向微信注册您的APPID,代码如下:
  final IWXAPI msgApi = WXAPIFactory.createWXAPI(ThirdActivity.this, null);
  // 将该app注册到微信
  msgApi.registerApp(appid);
  PayReq req = new PayReq();
  req.appId = appid;
  req.partnerId = partenerid;
  req.prepayId = prepayid;
  req.nonceStr = noncestr;
  req.timeStamp = timestamp;
  req.packageValue = packsges;
  req.sign = sign;
  msgApi.sendReq(req);
  }
  }
  };
  支付结果回调
  参照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调),在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。(net.sourceforge.simcpux为你的项目包名)代码示例如下:
  @Override
  public void onResp(BaseResp resp) {
  Log.d(TAG,"onPayFinish,errCode="+resp.errCode);
  // 判断resultStatus 为“0”则代表支付成功,具体状态码代表含义可参考接口文档
  if (resp.errCode.equals("0")) {
  Toast.makeText(ThirdActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
  }else if (resp.errCode.equals("-1")){
  // -1为支付失败,包括用户主动取消支付,或者系统返回的错误
  Toast.makeText(ThirdActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
  }else if (resp.errCode.equals("-2")){
  // -2为取消支付,或者系统返回的错误
  Toast.makeText(ThirdActivity.this, "取消支付", Toast.LENGTH_SHORT).show();
  }else {
  // 其他为系统返回的错误
  Toast.makeText(ThirdActivity.this, "支付错误", Toast.LENGTH_SHORT).show();
  }
  }
  以下三种为常用结果判断
  0为支付成功
  -1为支付失败
  -2为取消支付
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号