android微信支付开发过程

来源:互联网 发布:集中注意力训练软件 编辑:程序博客网 时间:2024/05/21 16:54
商户接入微信支付,调用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_id\n" + result.get("prepay_id") + "\n\n");
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("sign\n" + req.sign + "\n\n");
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 欢迎大家讨论。
0 0
原创粉丝点击