Android微信支付

来源:互联网 发布:函数式编程语言 编辑:程序博客网 时间:2024/05/29 07:13

Android 微信支付

又一次做微信支付,感觉坑还是不少.首先开发文档看不懂.其次给的Demo是Eclipse的,导入后还有各种问题.已经无力吐槽

Android端做微信开发还是挺简单的,主要作用是在后台.不过Android要注意以下几点:
1.商户在微信开放平台申请开发应用是所填写的包名必须和我们的APP包名对应.签名必须是根据我们的包名生成的.微信官方提供了一个APP用于生成签名
下载网址:https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk
这个可以参考微信官方文档: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
2.权限问题:
   <uses-permission android:name="android.permission.INTERNET" />   <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
这是微信支付所需要的三个权限

3.加入依赖:使用Android的加入如下依赖即可
   compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:1.1.6'
4.下面就是最重要的几步:(开始进行微信支付)
4.1:首先注册微信:
private IWXAPI wxApi;
/** * 初始化微信支付 */private void initWX() {    if (wxApi == null) {        wxApi = WXAPIFactory.createWXAPI(this, "wxf06c7839161ddd68");        wxApi.registerApp("wxf06c6659161ddd68");       }}
这个方法我是在Oncreate()方法中调用的
createWXAPI()方法中第一个参数是上下文,第二个参数是开放平台ID(也就是APPID),这个可以写为null
registerApp()注册到微信的方法,里面传递的也是开放平台的ID(也就是APPID),这个好像不能为null.w我没试过
   4.2:第一次与后台交互:(点击支付按钮的时候)
private void WxPlay(String money) {   boolean isPaySupported = wxApi.getWXAppSupportAPI() >= Build.PAY_SUPPORTED_SDK_INT;    if (isPaySupported) {        mRechargePresenter.getWXPlayNumber(String.valueOf(userId),"乐乐商城-支付", money);    } else {        showToast("未安装微信,或者微信版本过低");       }}
这个方法是验证当前设备(APP)是否支持微信支付,(
乐乐商城-支付
)此名字是随意起的.
主要解释:
mRechargePresenter.getWXPlayNumber(String.valueOf(userId),"乐乐商城-支付", money);
这行代码时去调用网络代码,向后台传递参数.然后后台会将这些参数生成预订单返回过来.我们拿着后台返回的数据就
可以去请求支付了.
代码解释:
String.valueOf(userId):后台要的UserId(用户的唯一标识),具体为什么要这个得问后台
"乐乐商城-支付" : 这个参数是微信支付时显示的:
money: 钱
    4.3:处理后台返回的数据
WXPlayBean.ResponseDataBean responseData = wxPlayBean.getResponseData();WXPlayBean.ResponseDataBean.AppResponseBean app_response = responseData.getApp_response();getPlay(app_response.getAppid(),app_response.getPartnerid(),app_response.getPrepayid(),
 app_response.getPackageX(), app_response.getNoncestr(), 
String.valueOf(app_response.getTimestamp()),
app_response.getSign());
这几行代码时后台返回的json字符串转化成的Bean对象.
getPlay:拿到这些参数后调用这个方法就可以吊起微信:
public void getPlay(String appId,String partnerId,String prepayId, 
String packageValue, String nonceStr, String timeStamp,String sign) {
    try {        PayReq request = new PayReq();        request.appId = "wxf064t83945hsdd68";        request.partnerId = "1485683242";        //微信返回的支付交易会话ID        request.prepayId = prepayId;        //暂填写固定值Sign=WXPay        request.packageValue = packageValue;        //随机字符串,不长于32位。推荐随机数生成算法        request.nonceStr = nonceStr;        //时间戳,请见接口规则-参数规定        request.timeStamp = timeStamp;        //根据包名生成的签名        request.sign = sign;       // request.extData = "app data";        wxApi.sendReq(request);    } catch (Exception e) {        Log.e("PAY_GET", "异常:" + e.getMessage());        showToast("异常:" + e.getMessage());    }}
吊起微信主要根据
prepayId(微信开放平台返回的)调动微信进行支付的.
request.appId = "wxf064t83945hsdd68"; 这个可以写死,可以通过后台传, 这个和上面注册到微信的AppId是一样的
        request.partnerId = "1485683242";  这个是商户号,写死即可.
下面这几个,是必须后台传递的.原理很简答.这些都是后台加密后传递到APP的.
//微信返回的支付交易会话ID        request.prepayId = prepayId;        //暂填写固定值Sign=WXPay        request.packageValue = packageValue;        //随机字符串,不长于32位。推荐随机数生成算法        request.nonceStr = nonceStr;        //时间戳,请见接口规则-参数规定        request.timeStamp = timeStamp;
//根据包名生成的签名        request.sign = sign;
这行代码,通过名字就可以知道,发送payReq,也就是调其微信进行支付的.
wxApi.sendReq(request);

好了这次Android集成.我只做了这么多,就可以正常支付了.后面肯定有问题,只能自己去解决了
   4.4:支付结果:
下载微信官方Demo可以在里面找到一个类:
WXPayEntryActivity
这个类一定要在这个包名下,
我的这个类如下:
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {    private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";    private IWXAPI api;    private TextView tv_text_result;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.pay_result);        tv_text_result = (TextView) findViewById(R.id.tv_text_result);        api = WXAPIFactory.createWXAPI(this, "wxf06c7839161ddd68");        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) {    }    @Override    public void onResp(BaseResp resp) {        ToastUtils.showToast(this, String.valueOf(resp.errCode) + resp.errStr);        if (resp.errCode == ConstantsAPI.COMMAND_UNKNOWN) {            //支付成功            tv_text_result.setText("支付成功");        } else {            //支付失败            tv_text_result.setText("支付失败");        }    }}
这是通过界面来显示支付是否成功的.如果不需要显示界面,可以将
setContentView(R.layout.pay_result);删除,
可通过土司显示
4.5:支付结果显示:
通过以上步骤可以得到微信发到APP的同步通知,但是这个通知是不能作为正确的支付结果返回给用户的.我们需要将同步通知发送的后台(主要是接收后台异步通知).
然后接收后台返回的异步通知,显示给用户是否支付成功.
4.6:注意:
测试的时候尽量使用正式的APP,
http://blog.csdn.net/qq_33689414/article/details/51169885
借用大神的博客一用.可用于给APP签名:
本次集成微信支付完成:最后附上微信官方文档:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
想了解微信支付的具体业务流程的可以参考
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3
微信官方Demo下载地址:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1
注:如有版权问题,请速联系本人.秒删.
原创粉丝点击