Android实现微信支付功能

时间:2021-12-26 06:59:54

开发android app微信支付功能,需要完成三个步骤:第一步生成预支付订单、第二步生成微信支付参数、第三步调起微信app支付。除了需要审核通过的app应用外,还需要获得微信支付接口权限,然后获取对应的商户号、api密钥,这两者缺一不可,并且在app微信支付中使用

获得商户号、api密钥

在微信开放平台中查看审核通过的app应用,是否申请支付功能,若已申请,登录微信支付|商户平台: http://pay.weixin.qq.com 查看对应的商户号、api密钥

》申请微信支付接口

Android实现微信支付功能

》登录商户平台

Android实现微信支付功能

》查看商户号

Android实现微信支付功能

》获取api密钥

Android实现微信支付功能

Android实现微信支付功能

第一步:生成预支付订单

将商品信息、商户信息使用basicnamevaluepair存放,然后存储在list列表中,并构造成xml字符串格式,以post方式微信提供的接口:https://api.mch.weixin.qq.com/pay/unifiedorder 发送数据,接收返回信息,获取prepay_id预支付订单编号

》生成订单请求

Android实现微信支付功能

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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", "weixin"));
 packageparams
  .add(new basicnamevaluepair("mch_id", constants.mch_id));
 packageparams.add(new basicnamevaluepair("nonce_str", noncestr));
 packageparams.add(new basicnamevaluepair("notify_url",
  "http://121.40.35.3/test"));
 packageparams.add(new basicnamevaluepair("out_trade_no",
  genouttradno()));
 packageparams.add(new basicnamevaluepair("spbill_create_ip",
  "127.0.0.1"));
 packageparams.add(new basicnamevaluepair("total_fee", "1"));
 packageparams.add(new basicnamevaluepair("trade_type", "app"));
 
 string sign = genpackagesign(packageparams);
 packageparams.add(new basicnamevaluepair("sign", sign));
 
 string xmlstring = toxml(packageparams);
 
 return xmlstring;
 
 } catch (exception e) {
 log.e(tag, "genproductargs fail, ex = " + e.getmessage());
 return null;
 }
 
 }

》获取预支付订单编号

Android实现微信支付功能

?
1
2
3
4
5
6
7
8
9
10
string url = string.format("https://api.mch.weixin.qq.com/pay/unifiedorder");
 string entity = genproductargs();
 
 log.e("orion", entity);
 
 byte[] buf = util.httppost(url, entity);
 
 string content = new string(buf);
 log.e("orion", content);
 map<string, string> xml = decodexml(content);

第二步:生成微信支付参数

appid对应app应用的appid,partnerid对应商户号,prepayid对应第一步获得的预支付订单,packagevalue取值sign=wxpay,noncestr是一串随机数,timestamp生成的时间戳,sign对应app签名

》支付参数配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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");
 
 show.settext(sb.tostring());
 
 log.e("orion", signparams.tostring());
 
 }

 》noncestr随机数

?
1
2
3
4
5
private string gennoncestr() {
 random random = new random();
 return md5.getmessagedigest(string.valueof(random.nextint(10000))
 .getbytes());
 }

》timestamp时间戳

?
1
2
3
private long gentimestamp() {
 return system.currenttimemillis() / 1000;
 }

》app签名

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private string genappsign(list<namevaluepair> params) {
 stringbuilder sb = new stringbuilder();
 
 for (int i = 0; i < params.size(); i++) {
 sb.append(params.get(i).getname());
 sb.append('=');
 sb.append(params.get(i).getvalue());
 sb.append('&');
 }
 sb.append("key=");
 sb.append(constants.api_key);
 
 this.sb.append("sign str\n" + sb.tostring() + "\n\n");
 string appsign = md5.getmessagedigest(sb.tostring().getbytes())
 .touppercase();
 log.e("orion", appsign);
 return appsign;
 }

第三步:调起微信app支付

支付之前,需要手机安装微信客户端,如果没有,会提示下载安装微信,然后再调起支付,在androidmanifest.xml文件中添加如下配置

?
1
2
3
4
5
6
7
8
9
10
11
12
<activity
 android:name=".act.payactivity"
 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="wxf2f565574a968187" />
 </intent-filter>
 </activity>

》调起微信支付

Android实现微信支付功能

?
1
2
3
4
5
private void sendpayreq() {
 
 msgapi.registerapp(constants.app_id);
 msgapi.sendreq(req);
 }

接收微信返回结果

在实现了iwxapieventhandler接口的activity中重写onresp(baseresp)方法,接收微信结果

》接收支付结果

?
1
2
3
4
5
6
7
8
9
10
11
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,
  resp.errstr + ";code=" + string.valueof(resp.errcode)));
 builder.show();
 }
 }

以上就是本文的全部内容,希望对大家的学习有所帮助。