您的位置:首页 > 移动开发

android应用集成微信app支付

2016-12-13 10:54 671 查看

前言

本文主要讲述的是android移动应用如何集成微信app支付。主要讲的是接入流程和开发事项,不是特别详细,旨在给未曾开发过微信支付的人讲述开发流程,让人知道从何下手。

接入流程

首先,需要在微信开放平台注册一个账号,然后认证开发者资质,成功认证后创建一个应用;接下来为应用申请微信支付,成功开户后,在线签署协议,最后就是开发了。接入流程详情参考APP微信商户申请步骤

微信支付业务流程

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

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

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

步骤4:商户APP调起微信支付。

步骤5:商户后台接收支付通知。

步骤6:商户后台查询支付结果。

开发步骤

1、在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。设置界面在【开放平台】中的栏目【管理中心 / 修改应用 / 修改开发信息】里面。



其中应用签名是通过签名工具获取安装在手机上的应用的应用签名,这个应用签名对应着一个包名和keystore文件。改了包名或者keystore文件的话这里也需要改,不然无法调起支付。

2、上一步弄好了之后就开始开发了。先下载sdk和demo,将sdk里libs文件夹下的jar包拷入项目里,然后新建一个包名为wxapi的包,然后将demo里WXPayEntryActivity这个类拷入这个包下,只需改动两个地方:

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{

private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";

private IWXAPI api;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pay_result);

api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);//改成自己的APPID
api.handleIntent(getIntent(), this);
}

@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}

@Override
public void onReq(BaseReq req) {
}

/**
* 支付结果回调处理,在这里处理支付结果以及后续操作
* 返回结果:
* 0:成功
* -1:错误,可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
* -2:用户取消,
*/
@Override
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, String.valueOf(resp.errCode)));
builder.show();
}
}
}


接下来就是参考demo里PayActivity这个类自己写一个调起支付工具类:

/**
* 微信支付
* 该类仅供参考
*/
public class WeiXinPay {
//1、集成好微信支付的sdk
//2、请求预支付(后台完成统一下单接口)
//3、调起微信支付

private IWXAPI api;
private Context context;
private String str1;

public void WeiXinPay(Context context){

}

/**
* 调起微信支付,参数都是后台返回
*/
public  void weixinPay(WeiXinPayCostBean weiXinPayCostBean){
//注册微信支付
api = WXAPIFactory.createWXAPI(context, "你的appId");
api.registerApp("你的appId");

boolean isPaySupported = api.getWXAppSupportAPI() >= Build.PAY_SUPPORTED_SDK_INT;
boolean isWXAppInstalledAndSupported = api.isWXAppInstalled();
if (isWXAppInstalledAndSupported) {
if (isPaySupported) {
PayReq req = new PayReq();
req.appId           =weiXinPayCostBean.getAppId;//appid
req.partnerId       = //商户号
req.prepayId        = //预支付交易会话id
req.packageValue    =  //扩展字段,暂时填写Sign=WXPay
req.nonceStr        = //随机字符串
req.timeStamp       = //时间戳

str1 = "appid=你的appId"+"&noncestr="+"随机字符串"+"&package="+"Sign=WXPay"+ "&partnerid=商户号"+"&prepayid="+"预支付Id"+"×tamp="+"时间戳";
String stringSignTemp = str1 +"&key=你的AppKey";
String sign= MD5Util.md5(stringSignTemp).toUpperCase();
req.sign            = sign;//签名
req
9879
.extData         = "app data"; // optional
api.sendReq(req);//调起支付
} else {
Toast.makeText(context, "检测到微信未开启或当前版本不支持微信支付,请开启微信后重新支付或更新当前版本", Toast.LENGTH_LONG).show();
api.openWXApp();
}
}else {
Toast.makeText(context, "检测到微信未安装,请安装微信后重新支付", Toast.LENGTH_LONG).show();
}
}
}

public class MD5Util {
public static String md5(String string) {
byte[] hash;
try {
hash = MessageDigest.getInstance("MD5").digest(
string.getBytes("UTF-8"));
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("Huh, MD5 should be supported?", e);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("Huh, UTF-8 should be supported?", e);
}

StringBuilder hex = new StringBuilder(hash.length * 2);
for (byte b : hash) {
if ((b & 0xFF) < 0x10)
hex.append("0");
hex.append(Integer.toHexString(b & 0xFF));
}
return hex.toString();
}

}


这些签名参数以及签名最好是后台直接返回,不要写在app端,参数含义参考APP端调起支付的参数列表。至于支付回调根据个人习惯用什么来接收处理。

至此微信支付就集成好了。

参考:微信支付开发文档
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 微信支付