本文将带您了解关于Android集成微信支付功能的新内容,同时我们还将为您解释android实现微信支付的相关知识,另外,我们还将为您提供关于androidapp(个人应用)怎么集成支付宝支付功能、a
本文将带您了解关于Android集成微信支付功能的新内容,同时我们还将为您解释android实现微信支付的相关知识,另外,我们还将为您提供关于android app(个人应用)怎么集成支付宝支付功能、android 微信支付、Android 微信支付开发流程、Android 微信支付无法调用微信客户端的实用信息。
本文目录一览:- Android集成微信支付功能(android实现微信支付)
- android app(个人应用)怎么集成支付宝支付功能
- android 微信支付
- Android 微信支付开发流程
- Android 微信支付无法调用微信客户端
Android集成微信支付功能(android实现微信支付)
准备工作这里就不说了,包括签约和申请APPID,附上微信开放平台APP开发步骤,不懂的同学可以参考这里:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
上面的步骤很详细,这里主要说下调起支付的注意事项。按照上面文档中说的商户服务器生成支付订单,先调用统一下单API生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。
相关代码如下:
/** * 商户服务器生成支付订单,先调用统一下单API(详见第7节)生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。 */ //商品描述 String body = "iphone6s"; //随机字符串 String nonce_str = ResourceUtil.createrandomString(32); //通知地址 String notify_url = "http://www.weixin.qq.com/wxpay/pay.PHP"; //商户订单号 String out_Trade_no = ResourceUtil.generateOutTradeNo(32); //总金额(单位分) int total_fee = 1; String url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; String sign = SignUtil.signByMD5("appid=" + Constants.APP_ID + "&body=" + body + "&mch_id=" + Constants.MCH_ID + "&nonce_str=" + nonce_str + "¬ify_url=" + notify_url + "&out_Trade_no=" + out_Trade_no + "&spbill_create_ip=127.0.0.1" + "&total_fee=" + total_fee + "&Trade_type=APP" + "&key=" + Constants.KEY).toupperCase(Locale.getDefault()); //参数以xml格式传递 String entity = "<xml><appid>" + Constants.APP_ID + "</appid><mch_id>" + Constants.MCH_ID + "</mch_id><nonce_str>" + nonce_str +"</nonce_str><sign>" + sign + "</sign><body>" + body + "</body><out_Trade_no>" + out_Trade_no + "</out_Trade_no><total_fee>" + total_fee + "</total_fee><spbill_create_ip>127.0.0.1</spbill_create_ip><notify_url>http://www.weixin.qq.com/wxpay/pay.PHP</notify_url><Trade_type>APP</Trade_type></xml>"; Log.d("entity",entity); payButton.setEnabled(false); Toast.makeText(PayActivity.this,"获取订单中...",Toast.LENGTH_SHORT).show(); byte[] buf = Util.httpPost(url,entity); if (buf != null && buf.length > 0) { String content = new String(buf); Log.d("get server pay params:",content); OrderResult orderResult = ResourceUtil.parseXml(new ByteArrayInputStream(content.getBytes())); if (!TextUtils.equals(orderResult.getReturnCode(),"SUCCESS")) { Toast.makeText(PayActivity.this,orderResult.getReturnMsg(),Toast.LENGTH_SHORT).show(); return; } if (!TextUtils.equals(orderResult.getResultCode(),orderResult.getErrorDesc(),Toast.LENGTH_SHORT).show(); return; } //下单成功,调起支付 PayReq request = new PayReq(); request.appId = Constants.APP_ID; request.partnerId = Constants.MCH_ID; request.prepayId = orderResult.getPrepayId(); request.packageValue = "Sign=WXPay"; request.nonceStr = nonce_str; String timeStamp = String.valueOf(System.currentTimeMillis() / 1000); request.timeStamp = timeStamp; request.sign = SignUtil.signByMD5("appid=" + Constants.APP_ID + "&noncestr=" + nonce_str + "&package=Sign=WXPay" + "&partnerid=" + Constants.MCH_ID + "&prepayid=" + orderResult.getPrepayId() + "×tamp=" + timeStamp + "&key=" + Constants.KEY).toupperCase(Locale.getDefault()); api.sendReq(request); payButton.setEnabled(true); } } });
相关参数说明在文档上都注明了,我这里面nonce_str和out_Trade_no都是我随机生成的字符创,附上我的工具类,方便大家参考。
ResourceUtil.java
package com.xylpay.sdk.pay.uikit; import java.io.IOException; import java.io.InputStream; import java.util.Random; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import com.xylpay.sdk.pay.bean.OrderResult; import android.util.Xml; public class ResourceUtil { /** * 随机生成字符串 * @param length 字符串的长度 * @return 随机字符串 */ public static String createrandomString(int length) { String source = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMnopQRSTUVWXYZ"; Random random = new Random(); StringBuilder builder = new StringBuilder(); for (int i = 0; i < length; i++) { int position = random.nextInt(source.length()); builder.append(source.charat(position)); } return builder.toString(); } public static String generateOutTradeNo(int n) { StringBuilder builder = new StringBuilder(); Random random = new Random(); for (int i = 0; i < n; i++) { builder.append(random.nextInt(10)); } return builder.toString(); } public static OrderResult parseXml(InputStream is) { //PULL解析xml数据 XmlPullParser parser = Xml.newPullParser(); OrderResult orderResult = null; try { parser.setInput(is,"UTF-8"); int type = parser.getEventType(); while(type != XmlPullParser.END_DOCUMENT) { switch (type) { case XmlPullParser.START_DOCUMENT: break; case XmlPullParser.START_TAG: if (parser.getName().equals("xml")) { orderResult = new OrderResult(); } else if (parser.getName().equals("return_code")) { orderResult.setReturnCode(parser.nextText()); } else if (parser.getName().equals("return_msg")) { orderResult.setReturnMsg(parser.nextText()); } else if (parser.getName().equals("result_code")) { orderResult.setResultCode(parser.nextText()); } else if (parser.getName().equals("err_code_des")) { orderResult.setErrorDesc(parser.nextText()); } else if (parser.getName().equals("prepay_id")) { orderResult.setPrepayId(parser.nextText()); } break; case XmlPullParser.END_TAG: break; } type = parser.next(); } } catch(XmlPullParserException e) { e.printstacktrace(); } catch (IOException e) { e.printstacktrace(); } return orderResult; } }
其中关于sign的生成,参数的顺序一定要严格按照上面的顺序加上key进行MD5加密,查看签名规范。
关于key的说明,这里的key是需要自己生成然后配置到微信开放平台的,参考商户支付密钥key的生成与设置进行配置,两边需要保持一致。另外,下单时,参数要以xml的格式来传递。
最后附上自己的签名算法:
SignUtil.java
package com.xylpay.sdk.pay.uikit; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * Created by Jackie on 2016/2/15. * * MD5加密 */ public class SignUtil { public static String signByMD5(String source) { byte[] bytes = null; try { MessageDigest digest = MessageDigest.getInstance("MD5"); digest.update(source.getBytes()); //更新摘要 bytes = digest.digest(); //再通过执行诸如填充之类的最终操作完成哈希计算。在调用此方法之后,摘要被重置。 } catch (NoSuchAlgorithmException e) { e.printstacktrace(); } StringBuilder builder = new StringBuilder(bytes.length * 2); for (byte b : bytes) { /** * 0xFF默认是整形,一个byte跟0xFF相与会先将那个byte转化成整形运算 */ if ((b & 0xFF) < 0x10) { //如果为1位 前面补个0 builder.append("0"); } builder.append(Integer.toHexString(b & 0xFF)); } return builder.toString(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
android app(个人应用)怎么集成支付宝支付功能
我想做一个android app集成支付宝支付功能的demo。
把官方demo下载下来导入到eclipse,然后修改PartnerConfig里的配置信息,再运行在手机上面,提示“订单签名错误,请检查partner对应的密钥是否正确”。
我在支付宝无线商户平台咨询在线小二得到的回复是个人app无法集成支付宝的无线产品功能。
不知道是不是这样?
那个人app能使用支付宝那块功能呢?小二那边回复也是使用不了 - - 汗汗汗
android 微信支付
OSC 请你来轰趴啦!1028 苏州源创会,一起寻宝 AI 时代
Android 微信支付开发流程
首先奉上调起支付页面截图
一:介绍
项目中要用到支付功能,需要支付宝支付、微信支付、银联支付,所以打算总结一下,方便以后的查阅,也方便大家, 用到的地方避免再次被坑。 今天我们就主要介绍一下微信支付,其他支付也写了对应教程,并且给出了连接。
集成前首先要看看文档,微信支付开发文档里面有详细的字段和说明。 微信支付是需要签名的,跟支付宝一样,可以在客户端签名,也可以在后台签名(当然,为了安全还是推荐在服务器上做签名,逻辑也比较好理解)
二:业务流程
以下是交互时序图,统一下单API、支付结果通知API和查询订单API等都涉及签名过程,调用都必须在商户服务器端完成。
商户系统和微信支付系统主要交互说明:
-
- 用户在商户APP中选择商品,提交订单,选择微信支付。
-
- 商户后台收到用户支付单,调用微信支付统一下单接口。
-
- 统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appid,partnerid,prepayid,noncestr,timestamp,package。
-
- 商户APP调起微信支付。
-
- 商户后台接收支付通知。
-
- 商户后台查询支付结果。
三:下载微信SDK
微信开放平台下载SDK 建议把Android头文件和支付示例都下载下来
四:后台设置
商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。设置界面在【开放平台】中的栏目【管理中心 / 修改应用 / 修改开发信息】里面。如下图:
应用包名:是在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
net.sourceforge.simcpux 是项目包名
五:导入开发SDK
导入sdk流程同支付宝导入流程一样,这里就借用支付宝导入流程进行介绍。
5.1 如果项目开发使用的Eclipse软件,导入步骤如下:
1.将alipaySDK-20150602.jar包放入商户应用工程的libs目录下,如下图。
[图片上传中...(104.png-ea4547-1510284076514-0)]
2.进入商户应用工程的Java Build Path,将libs目录下的alipaySDK-20150602.jar导入,如下图。
3.选中Order and Export,勾选alipaySDK-20150602.jar,如下图。
将上图的支付宝sdk更换成微信sdk即可
5.2 如果项目开发使用的Android Studio软件,导入步骤如下:
1.将微信SDK拷贝到项目libs文件夹下,如果没有libs文件夹,就新建一个。
2.如果sdk使用过程中,提示找不到文件。 进行如下操作,选中sdk文件,右击选择Reveal in Finder
六:修改AndroidManifest.xml配置
1.在商户应用工程的AndroidManifest.xml文件里面添加声明:
<!--微信-->
<activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTop">
</activity>
和权限声明:
<!--微信-->
<uses 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为取消支付
希望可以帮助大家 如果哪里有什么不对或者不足的地方,还望读者多多提意见或建议 Android技术交流群:591625129
Android 微信支付无法调用微信客户端
项目中在开发 Android 原生 App 微信支付,在微信开放平台注册了 App 并认证,开通了微信支付。
参照官方文档开发,https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
1、服务端(Java)实现了统一下单 API
2、客户端(Android)调起支付API始终失败
关键代码:
A -- Java
B -- Android
C -- Android
4 -- Android 错误信息
注:
AppID、AppSecret、商户支付 mchid、mchkey 均已设置过,
微信开放平台里的 App 签名已设置过了(Debug、Release都试了),
始终报图4的错误,点击支付没有任何反应。官方的 Demo 报错,无法运行。
请开发过 Android 微信支付的朋友看看,还有哪里忽略了?
今天关于Android集成微信支付功能和android实现微信支付的讲解已经结束,谢谢您的阅读,如果想了解更多关于android app(个人应用)怎么集成支付宝支付功能、android 微信支付、Android 微信支付开发流程、Android 微信支付无法调用微信客户端的相关知识,请在本站搜索。
本文标签: