概述
商户接入微信支付,调用API必须遵循以下规则:
表4.1 接口规则
传输方式
为保证交易安全性,采用HTTPS传输
提交方式
采用POST方法提交
数据格式
提交和返回数据都为XML格式,根节点名为xml
字符编码
统一采用UTF-8字符编码
签名算法
MD5,后续会兼容SHA1、SHA256、HMAC等。
签名要求
请求和接收数据均需要校验签名,详细方法请参考安全规范-签名算法
证书要求
调用申请退款、撤销订单接口需要商户证书
判断逻辑
先判断协议字段返回,再判断业务返回,最后判断交易状态
一、支付流程:1、首先是把该app注册到微信,
2、发起一个线程生成支付订单。这里要注意金额的单位为分,只能为整数。
3、把支付订单post到后台生成一个预支付订单,返回prepay_id(预支付回话标识)
4、将参数再次签名传输给app发起支付,
5、支付结果会在WXPayEntryActivity类里onResp函数中查看,当errCode为:0表示成功 -1表示错误 -2表示用户取消。
二、代码实现部分
2.1 在androidmanifest.xml中注册。
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
</activity>
<receiver android:name="net.sourceforge.simcpux.AppRegister">
<intent-filter>
<action android:name="com.tencent.mm.plugin.openapi.Intent.ACTION_REFRESH_WXAPP" />
</intent-filter>
</receiver>
2.2 把libammsdk.jar拷贝到项目的libs里。
2.3 将该app注册到微信
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
msgApi.registerApp("APP_ID");
2.4 发起一个线程生成支付订单。
GetPrepayIdTask getPrepayId = new GetPrepayIdTask();
getPrepayId.execute();
private class GetPrepayIdTask extends
AsyncTask<Void, Void, Map<String, String>> {
@Override
protected void onPreExecute() {
}
@Override
protected void onPostExecute(Map<String, String> result) {
//生成预付单的结果
sb.append("prepay_idn" + result.get("prepay_id") + "nn");
resultunifiedorder = result;
genPayReq();
}
@Override
protected void onCancelled() {
super.onCancelled();
}
@Override
protected Map<String, String> doInBackground(Void... params) {
String url = String
.format("https://api.mch.weixin.qq.com/pay/unifiedorder");
//生成的支付订单
String entity = genProductArgs();
//把生成的支付订单post生成预付单
byte[] buf = Util.httpPost(url, entity);
String content = new String(buf);
Map<String, String> xml = decodeXml(content);
return xml;
}
}
生成支付订单。
private String genProductArgs() {
StringBuffer xml = new StringBuffer();
try {
String nonceStr = genNonceStr();
xml.append("</xml>");
List<NameValuePair> packageParams = new LinkedList<NameValuePair>();
packageParams
.add(new BasicNameValuePair("appid", Constants.APP_ID));
packageParams.add(new BasicNameValuePair("body", name));
packageParams
.add(new BasicNameValuePair("mch_id", Constants.MCH_ID));
packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));
packageParams.add(new BasicNameValuePair("notify_url",
weixinUrl
));
orderCode = genOutTradNo();
packageParams.add(new BasicNameValuePair("out_trade_no",
orderCode));
packageParams.add(new BasicNameValuePair("spbill_create_ip",
"127.0.0.1"));
double totalFee = price*100;
//单位是分
packageParams.add(new BasicNameValuePair("total_fee", String.valueOf((int)totalFee)));
packageParams.add(new BasicNameValuePair("trade_type", "APP"));
String sign = genPackageSign(packageParams);
packageParams.add(new BasicNameValuePair("sign", sign));
String xmlstring = toXml(packageParams);
return new String(xmlstring.toString().getBytes(), "ISO8859-1");
//
return xmlstring;
} catch (Exception e) {
Log.e(TAG, "genProductArgs fail, ex = " + e.getMessage());
return null;
}
}
// 生成签名参数
private void genPayReq() {
req.appId = Constants.APP_ID;
req.partnerId = Constants.MCH_ID;
req.prepayId = resultunifiedorder.get("prepay_id");
req.packageValue = "Sign=WXPay";
req.nonceStr = genNonceStr();
req.timeStamp = String.valueOf(genTimeStamp());
List<NameValuePair> signParams = new LinkedList<NameValuePair>();
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("signn" + req.sign + "nn");
if (DEBUG) {
Log.e(TAG, "genPayReq:" + signParams.toString()+" req:"+req.toString());
}
}
2.5 调用微信支付
private void sendPayReq() {
msgApi.registerApp(Constants.APP_ID);
msgApi.sendReq(req);
}
2.6 支付结果判断
在WXPayEntryActivity类中onResp判断。
public void onResp(BaseResp resp) {
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
if( resp.errCode== GjtcConstant.ZERO)
{
Toast.makeText(this, "支付成功!", Toast.LENGTH_SHORT).show();
}else if(resp.errCode== -1)
{
Toast.makeText(this, "支付错误!", Toast.LENGTH_SHORT).show();
finish();
}else if(resp.errCode== -2)
{
Toast.makeText(this, "用户取消!", Toast.LENGTH_SHORT).show();
finish();
}
}
}
开发过程中遇到的问题
1、生成预支付订单的时候会生成失败。
原因:1、因为金额的单位写错了,单位为分,只为整数。2、签名的问题,因为我开发的运行的app签名与网站上写的不一样。所以这里要注意下。
2、支付返回结果收不到,onResp没有走到。
原因:报名写错了,wxapi.WXPayEntryActivity这个必须放到你app包名下才会收到通知。不然会收不到。
QQ技术交流群: 185140783 欢迎大家讨论。
最后
以上就是悲凉冬天为你收集整理的android微信支付开发过程的全部内容,希望文章能够帮你解决android微信支付开发过程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复